Аппараттық және бағдарламалық қамтамасыз етуді орнату

Javascript тексеру айнымалы түрі. Динамикалық типті анықтау

Оператор түріоперанд түрін көрсететін жолды қайтарады.

Синтаксис

Операнд типті операторға сәйкес келеді:

түрі операнд

Параметрлер

операндтүрі қайтарылатын нысанды немесе қарабайырды білдіретін өрнек болып табылады.

Сипаттама

Келесі кестеде typeof қайтару мәндерінің тізімі берілген. Түрлер мен примитивтер туралы қосымша ақпарат бетте.

Мысалдар

// Numbers typeof 37 === "сан"; typeof 3.14 === "сан"; typeof(42) === "сан"; typeof Math.LN2 === "сан"; typeof Infinity === «сан»; typeof NaN === "сан"; // ол Number(1) түрі "Not-A-Number" болса да === "сан"; // бұл белгіні ешқашан қолданбаңыз! // Жолдар typeof "" === "жол"; typeof "bla" === "жол"; typeof "1" === "жол"; // жол ішіндегі сан әлі де string typeof (typeof 1) түріне жататынын ескеріңіз === "string"; // typeof бұл жағдайда әрқашан жолды қайтарады typeof String("abc") === "жол"; // бұл белгіні ешқашан қолданбаңыз! // Логикалық мәндер typeof true === "логикалық"; typeof false === "логикалық"; typeof логикалық(шын) === "логикалық"; // бұл белгіні ешқашан қолданбаңыз! // Таңбалар түрі Symbol() === "таңба" түрі Symbol("foo") === "символ" түрі Symbol.iterator === "символ" // Анықталмаған түрі анықталмаған === "анықталмаған"; typeof declaredButUndefinedVariable === "анықталмаған"; typeof unclaredVariable === "анықталмаған"; // Объектілер typeof(a: 1) === "объект"; // кәдімгі нысандар мен массивтерді ажырату үшін Array.isArray немесе Object.prototype.toString.call // пайдаланыңыз typeof === "объект"; typeof new Date() === "нысан"; // Төмендегі кез келген нәрсе қателер мен мәселелерге әкеледі. Қолданбаңыз! typeof new Boolean(true) === "нысан"; typeof new Number(1) === "нысан"; typeof new String("abc") === "нысан"; // Функциялар typeof function() () === "функция"; typeof class C() === "функция"; typeof Math.sin === "функция";

null

// Бұл JavaScript typeof туылғаннан бері анықталған null === "объект";

JavaScript бірінші іске асыруда мәндер тег түрі мен мән жұбы арқылы ұсынылды. Нысандарға арналған тег түрі 0 болды. null нөлдік көрсеткіш ретінде ұсынылды (көп платформаларда 0x00). Сондықтан null үшін тегтің түрі нөл болды, сондықтан typeof қайтаратын мәні жалған. ()

ECMAScript жүйесінде түзету ұсынылды (өшіру арқылы), бірақ қабылданбады. Бұл typeof null === "null" түріне әкеледі.

Жаңа операторды пайдалану

// "new" көмегімен жасалған барлық конструктор функциялары "объект" түрінде болады var str = new String("String"); var num = new Number(100); typeofstr; // "нысан" түрін қайтару num; // «Нысан» қайтарады // Бірақ Функция конструкторы үшін ерекше жағдай бар var func = new Function(); функция түрі; // «функцияны» қайтару

Тұрақты өрнектер

Қоңырау шалды тұрақты тіркестеркейбір браузерлерде стандартты емес қосымша болды.

Typeof /s/ === "функция"; // Chrome 1-12 ECMAScript 5.1 сәйкес емес typeof /s/ === "нысан"; // Firefox 5+ ECMAScript 5.1 сәйкес келеді

Уақытша өлі аймақтарға қатысты қателер

ECMAScript 2015 нұсқасына дейін бұған кепілдік берілген оператор түріол шақырылған кез келген операнд үшін жолды қайтарады. Бұл көтермейтін блок ауқымы бар let және const декларацияларын қосу арқылы өзгерді. Енді, егер айнымалылар let және const арқылы жарияланса және typeof олар айнымалы декларация блогында шақырылса, бірақ декларациядан бұрын, онда ReferenceError жіберіледі. Тәртіп жарияланбаған айнымалылардан ерекшеленеді, ол үшін typeof "анықталмаған" қайтарады. Блок ауқымындағы айнымалылар блоктың басынан айнымалылар жарияланған сәтке дейін созылатын «уақытша өлі аймақта» болады. Бұл аймақта айнымалы мәндерге қол жеткізу әрекеті ерекше жағдайды шығарады.

Typeof unclaredVariable === "анықталмаған"; newLetVariable түрі; newLetVariable болсын; // newConstVariable анықтамалық қате түрі; const newConstVariable = "сәлем"; // Анықтамалық қате

Ерекшеліктер

Барлығында ағымдағы браузерлер Undefined түріндегі документ.all стандартты емес хост нысаны бар.

type of document.all === "анықталмаған";

Спецификация стандартты емес экзотикалық нысандар үшін теңшелетін түр атауларына рұқсат бергенімен, бұл атаулар алдын ала анықталғандардан өзгеше болуы қажет. Document.all undefined түріне жататын жағдай ережелердің ерекше бұзылуы ретінде қарастырылуы керек.

Техникалық сипаттамалар

Техникалық сипаттама Күй Пікірлер
ECMAScript соңғы жобасы (ECMA-262)
Жоба
ECMAScript 2015 (6-шы шығарылым, ECMA-262)
Осы спецификациядағы "Оператор түрі" анықтамасы.
Стандартты
ECMAScript 5.1 (ECMA-262)
Осы спецификациядағы "Оператор түрі" анықтамасы.
Стандартты
ECMAScript 3-ші басылымы (ECMA-262)
Осы спецификациядағы "Оператор түрі" анықтамасы.
Стандартты
ECMAScript 1-шығарылымы (ECMA-262)
Осы спецификациядағы "Оператор түрі" анықтамасы.
Стандартты Бастапқы анықтама. JavaScript 1.1 жүйесінде енгізілген

Браузер үйлесімділігі

GitHub жүйесінде үйлесімділік деректерін жаңартыңыз

КомпьютерлерҰялысервер
ChromeжиегіFirefoxInternet ExplorerОперасафариандроид веб-қарауыAndroid үшін ChromeAndroid үшін FirefoxAndroid үшін OperaiOS жүйесіндегі SafariSamsung интернетіNode.js
түріChrome Толық қолдау 1 жиегі Толық қолдау 12 Firefox Толық қолдау 1 IE Толық қолдау 3 Опера Толық қолдауИәсафари Толық қолдауИәвеб-көрініс Android Толық қолдау 1 Chrome Android Толық қолдау 18 Firefox Android Толық қолдау 4 OperaAndroid Толық қолдауИәSafari iOS Толық қолдауИәSamsung Интернет Android Толық қолдау 1.0 nodejs Толық қолдауИә

Аңыз

Толық қолдауТолық қолдау

IE-арнайы ескертпелер

IE 6, 7 және 8-де көптеген хост нысандары функциялар емес, нысандар болып табылады. Мысалы.

Динамикалық типті анықтау

Динамикалық типті анықтау (RTTI)орындау уақытында нысанның түрін анықтауға мүмкіндік береді. Бұл бірнеше себептерге байланысты пайдалы болып шықты. Атап айтқанда, негізгі сыныпқа сілтеме жасай отырып, сіз осы сілтеме арқылы қол жетімді нысанның түрін дәл анықтай аласыз. Динамикалық түрді анықтау сонымен қатар типті құю нәтижесінің қаншалықты сәтті болатынын алдын ала тексеруге мүмкіндік береді, бұл қате түрді құюға байланысты ерекше жағдайды болдырмайды. Сонымен қатар, динамикалық типті анықтау рефлексияның негізгі құрамдас бөлігі болып табылады.

Динамикалық түр идентификациясын қолдау үшін C# үшеуін қамтамасыз етеді кілт сөздер a: is, as және typeof. Осы кілт сөздердің әрқайсысы өз кезегінде әрі қарай талқыланады.

оператор болып табылады

Нысанның нақты түрін is операторы арқылы анықтауға болады. Төменде оның жалпы формасы берілген:

өрнек түрі болып табылады

мұндағы өрнек түрі тексерілетін нысанды сипаттайтын жалғыз өрнекті білдіреді. Егер өрнек үйлесімді немесе тексерілетін түрмен бірдей болса, онда бұл әрекеттің нәтижесі ақиқат болады, әйтпесе- жалған. Осылайша, өрнек сол немесе басқа пішінде тексерілетін түрге жататын болса, нәтиже ақиқат болады. is операторында, егер олар бірдей тип болса немесе сілтеме түрлендіру, қораптау немесе қораптан шығару қамтамасыз етілсе, екі түр де үйлесімді ретінде анықталады.

Төменде is операторын пайдалану мысалы берілген:

Жүйені пайдалану; аттар кеңістігі ConsoleApplication1 ( класс Қосу ( ) сынып Қосынды: Қосу ( ) сынып Бағдарлама ( статикалық бос Main() ( Қосу = жаңа Қосу(); Қосынды s = жаңа Қосынды(); егер (а Қосу) Console.WriteLine("Айнымалы a түрі Add"); if (s - Sum) Console.WriteLine("s айнымалысының түрі Add сыныбынан мұраланған"); Console.ReadLine(); ) ) )

оператор ретінде

Кейде түр түрлендіруі орындалу уақытында орындалуы керек, бірақ түрлендіру сәтсіз болған жағдайда ерекше жағдайды шығару үшін емес, бұл түрді трансляциялаумен әбден мүмкін. As операторы осы мақсатқа қызмет етеді және келесі жалпы пішінге ие:

түрі ретінде өрнек

мұндағы өрнек көрсетілген түрге түрлендірілетін жалғыз өрнекті білдіреді.

Мұндай түрлендірудің нәтижесі сәтті болса, түрге сілтеме қайтарылады, әйтпесе нөлдік сілтеме. As операторы тек анықтамалық түрлендіру, сәйкестендіру, бокс, қораптан шығару үшін ғана пайдаланылуы мүмкін. Кейбір жағдайларда as операторы is операторына ыңғайлы балама бола алады. Мысал ретінде келесі бағдарламаны қарастырыңыз:

Жүйені пайдалану; аттар кеңістігі ConsoleApplication1 ( класс Қосу ( ) сынып Қосынды: Қосу ( ) сынып Бағдарлама ( статикалық void Main() ( Қосу = жаңа Қосу(); Қосынды s = жаңа қосынды(); // Қосу ретінде a = s шығаруды орындаңыз; егер ( a != null) Console.WriteLine("Түрлендіру сәтті аяқталды"); else Console.WriteLine("Түрлендіру кезіндегі қате"); Console.ReadLine(); ) ) )

Бұл бағдарламаны орындау нәтижесі сәтті түрлендіру болады.

a = (b > 0) && (c + 1 != d); жалау = !(күй = 0);

14.5-кесте. Логикалық операторлар

Оператор сипаттамасы

! ЕМЕС (логикалық инверсия)

&& ЖӘНЕ (логикалық көбейту)

|| НЕМЕСЕ (логикалық қосу)

14.6-кесте. ЖӘНЕ және НЕМЕСЕ операторларын орындау нәтижелері

Операнд 1

Операнд 2

14.7-кесте. NOT операторын орындау нәтижелері

typeof операторын алыңыз

Түр операторын алыңыз typeof операндтың деректер түрін сипаттайтын жолды қайтарады. Түрі табылатын операнд осы оператордан кейін қойылып, жақшаға алынады:

s = typeof("str");

Осы өрнектің нәтижесінде s айнымалысы жол түрін білдіретін "жол" жолын қамтиды.

Typeof операторы қайтара алатын барлық мәндер 1-кестеде келтірілген. 14.8.

14.8-кесте. Оператор түрімен қайтарылған мәндер

Деректер түрі

Қайтару жолы

Жол

Сандық

14.8-кесте (соңы)

Деректер түрі

Қайтару жолы

Логикалық

Үйлесімділік және деректер түрін түрлендіру

Тағы екі маңызды мәселені қарастыратын кез келді: деректер түрінің үйлесімділігі және бір түрден екіншісіне түрлендіру.

Екі санды қосқанда не болады? Бұл дұрыс - басқа сандық мән. Сан мен жолды қоссаңыз ше? Айтуға қиын... Бұл жерде JavaScript деректер типінің сәйкессіздігі мәселесімен айналысады және олардың біреуін екіншісіне түрлендіру арқылы осы типтерді үйлесімді етуге тырысады. Ол алдымен жолды санға түрлендіруге тырысады және ол сәтті болса, қосуды орындайды. Сәтсіз болса, сан жолға түрлендіріледі және нәтижелі екі жол біріктіріледі. Мысалы, 14-6 тізімдегі веб-скрипт a айнымалысына қосылғанда b айнымалысының мәнін сандық түрге түрлендіреді; осылайша c айнымалысы 23 мәнін қамтиды.

Листинг 14.6

var a, b, c, d, e, f; a = 11;

b = "12"; c = a + b;

d="JavaScript"; e = 2;

Бірақ d айнымалысының мәнін санға түрлендіру мүмкін болмағандықтан, e мәні жолға түрлендіріледі, ал нәтиже - f мәні - тең болады

Логикалық мәндер сәйкесінше сандық немесе жол мәндеріне түрлендіріледі. True 1 санына немесе "1" жолына, ал жалған 0 немесе "0" мәніне түрлендіріледі. Керісінше, 1 саны түрленеді шын, ал 0 саны жалған болып орнатылған. Сондай-ақ, false түрлендіріледі

біз нөл және анықталмағанбыз.

III бөлім. Веб-бет әрекеті. Веб сценарийлері

JavaScript тіпті қате жазылған өрнектерді де дұрыс орындау үшін күресетінін көруге болады. Кейде ол жұмыс істейді, бірақ көбінесе бәрі жоспарланғандай орындалмайды және сайып келгенде, веб-скрипт сценарийдің мүлде басқа жерінде, абсолютті дұрыс мәлімдемеде табылған қатеге байланысты тоқтатылады. Сондықтан мұндай оқиғалардан аулақ болған дұрыс.

Оператордың басымдылығы

Мұнда біз қарастыратын соңғы мәселе - оператордың басымдығы. Біздің есімізде, басымдық өрнектегі операторлардың орындалу ретіне әсер етеді.

Келесі өрнек болсын:

Бұл жағдайда алдымен b айнымалысының мәніне c мәні қосылады, содан кейін қосындыдан 10 алынады.Бұл өрнектің операторлары бірдей басымдыққа ие, сондықтан солдан оңға қарай қатаң түрде орындалады.

Енді мына өрнекті қарастырыңыз:

Мұнда алдымен с мәні 10-ға көбейтіледі, содан кейін ғана алынған көбейтіндіге b мәні қосылады. Көбейту операторының қосу операторына қарағанда басымдығы жоғары, сондықтан «қатаң солдан оңға қарай» тәртібі бұзылады.

Тағайындау операторлары ең төменгі басымдыққа ие. Сондықтан алдымен өрнектің өзі бағаланады, содан кейін оның нәтижесі айнымалыға тағайындалады.

В Жалпы алғанда, барлық операторларды орындаудың негізгі принципі келесідей: бірінші кезекте жоғарырақ операторлар орындалады, содан кейін ғана төменірек операторлар орындалады. Бірдей басымдығы бар операторлар олардың пайда болу ретімен (солдан оңға қарай) орындалады.

В қойындысы. 14.9 біз зерттеген барлық операторларды олардың басымдылығының кему ретімен тізімдейді.

14.9-кесте. Оператордың басымдығы (кему ретімен)

Операторлар

Сипаттама

++ -- - ~ ! түрі

Көбейту, азайту, белгіні өзгерту, логикалық ЕМЕС, типті қорытынды

Көбейту, бөлу, қалдық

Жолды қосу және жалғау, азайту

Салыстыру операторлары

логикалық ЖӘНЕ

14-тарау. Веб-бағдарламалауға кіріспе. JavaScript тілі

14.9-кесте (соңы)

Операторлар

Сипаттама

Логикалық НЕМЕСЕ

Шартты оператор (төменде қараңыз)

= <оператор>=

Тапсырма, қарапайым және күрделі

НАЗАР АУДАРЫҢЫЗ!

Бұл кестені есте сақтаңыз. Мәлімдемелердің орындалу реті дұрыс емес анық көрінетін абсолютті дұрыс өрнек қате нәтиже беретін қателерді тудыруы мүмкін.

Бірақ мәлімдемелердің қалыпты орындалу тәртібін бұзу қажет болса ше? Жақшаларды қолданайық. Бұл белгіде алдымен жақшаға алынған операторлар орындалады:

a = (b + c) * 10;

Мұнда алдымен b және c айнымалыларының мәндері қосылады, содан кейін алынған қосынды 10-ға көбейтіледі.

Жақшаға алынған операторлар да басымдыққа жатады. Сондықтан бірнеше кірістірілген жақшалар жиі пайдаланылады:

a = ((b + c) * 10 - d) / 2 + 9;

Мұнда мәлімдемелер келесі ретпен орындалады:

1. b және c қосыңыз.

2. Алынған соманы 10-ға көбейтіңіз.

3. Көбейтіндіден d-ні азайту.

4. Айырмашылықты 2-ге бөліңіз.

5. Бөлшекке 9-ды қосу.

Егер сіз жақшаларды алып тастасаңыз:

a = b + c * 10 - d / 2 + 9;

онда операторлардың орындалу реті келесідей болады:

1. c пен 10-ды көбейтіңіз.

2. d санын 2-ге бөліңіз.

3. b қосу және с және 10 көбейту.

4. Бөлуден алынған бөліктің қосындысынан алу d-ден 2-ге дейін.

5. Алынған айырмаға 9 қосу.

Бұл мүлдем басқа нәтиже болып шығады, солай емес пе?

JavaScriptнемесе JS(қысқаша) оңай тіл емес және жаңадан бастаған әзірлеушілер бұл туралы бірден біле алмайды. Бастапқыда олар негіздерді үйренеді және бәрі түрлі-түсті және әдемі болып көрінеді. Біраз тереңірек барсақ, бар JavaScript массивтері, нысандар, кері қоңыраулар және жиі ақылға қонымды нәрселер.

JavaScript-те айнымалының түрін дұрыс тексеру маңызды. Айнымалының массив немесе объект екенін білгіңіз келеді делік? Оны қалай дұрыс тексеруге болады? Бұл нақты жағдайда тексеру кезінде трюктар бар және бұл пост осы туралы болады. Бірден бастайық.

Айнымалының түрін тексеру

Мысалы, айнымалының нысан, массив, жол немесе сан екенін тексеру керек. Сіз бұл үшін typeof пайдалана аласыз, бірақ ол сізге әрқашан шындықты айта бермейді, мен төмендегі мысалда неге екенін көрсетемін.

Мен бұл мысалды typeof неге әрқашан дұрыс таңдау емес екенін көрсету үшін жаздым.

Var _comparison = ( жол: "жол", int: 99, қалқымалы: 13.555, нысан: (сәлем: "сәлем"), массив: жаңа массив(1, 2, 3) ); // Объектінің кілттері бар массивді қайтарады var _objKeys = Object. keys(_comparison); for(var i = 0; i<= _objKeys.length - 1; i++) { // выведем в консоль тип каждой переменной console.log(typeof _comparson[_objKeys[i]]); }

Кодты орындау нәтижесі:

Жолдық сандар объектісі

Дұрыс па? - Жоқ әрине. Екі мәселе бар. Олардың әрқайсысы егжей-тегжейлі сипатталады және шешім ұсынылады.

Бірінші мәселе: өзгермелі сан, сан ретінде шығару

Comparison.float сан емес және санның орнына қалқымалы болуы керек.Мұны түзету үшін төмендегі кодтағыдай тексеру арқылы функция жасауға болады.

Var_floatNumber = 9,22; var_notFloatNumber = 9; console.log(isFloat(_floatNumber)); console.log(isFloat(_notFloatNumber)); console.log(isFloat("")); функция isFloat(n)(қайтаратын Сан(n) === n && n % 1 !== 0; )

isFloat() функциясы өзгермелі нүкте сандары үшін барлық мәндерді тексереді. Алдымен айнымалының тең екенін тексеріңіз nсаны (Number(n) === n) және иә болса, қалдыққа бөлу үшін тағы бір тексеру жүргізіледі, ал егер қалдық болса, логикалық мән қайтарылады ( шыннемесе жалған) нәтиже (n % 1 !== 0).

Жоғарыдағы мысалда ол қайтарылады шын, жалғанжәне жалған. Бірінші мағынасы жүзутүрі, екіншісі емес - бұл қалыпты сан және соңғысы ережелерге сәйкес келмейтін бос жол ғана.

Екінші мәселе: массив объект ретінде анықталды

Ең бірінші мысалда массив нысан ретінде көрсетіледі, бұл өте жақсы емес, өйткені кейде бұл түрді пайдалану керек және басқа ештеңе қажет емес.

Жиым түрі үшін айнымалыны тексерудің бірнеше жолы бар.

Бірінші нұсқа (жақсы нұсқа). instanceof() арқылы деректердің массивке жататынын тексеріңіз.

Var data = new Array("сәлем", "әлем"); var isArr = деректер данасы массиві;

Екінші нұсқа (жақсы нұсқа). Array.isArray() әдісі айнымалының жиым немесе массив еместігіне байланысты логикалық мәнді қайтарады ().

Var data = new Array("сәлем", "әлем"); var isArr = Array.isArray(деректер);

Үшінші нұсқа (ең жақсы, бірақ ұзақ). Ыңғайлы болу үшін бұл әдісті функцияға айналдыруға болады. Объектіні пайдалану арқылы біз жасаймыз. Object.prototype.toString.call(деректер) нәтижесі тең болмаса, онда айнымалы массив () емес.

Var data = new Array("сәлем", "әлем"); var isArr = Object.prototype.toString.call(data) == ""; console.log(isArr);

Ыңғайлылық функциясы ретінде соңғы нәтиже:

isArray(деректер) функциясы (қайтару Object.prototype.toString.call(data) == "" )

Енді сіз isArray() функцияларына қоңырау шалып, массив немесе басқа нәрсені аргумент ретінде орнатып, нәтижені көре аласыз.

Кейінгі сөз

Рекорд бастапқыда ойластырылғаннан әлдеқайда үлкен болып шықты. Бірақ мен оған ризамын, өйткені ол JavaScript-те айнымалы мәндерді тексеру қиындықтарын және оларды айналып өтуді сипаттау үшін жеткілікті қысқа және түсінікті.

Сұрақтарыңыз болса, осы посттың астына қалдырыңыз. Мен көмектесуге қуаныштымын.

Мақала ұнады ма? Достарыңызбен бөлісіңіз!
Бұл мақала пайдалы болды ма?
Иә
Жоқ
Пікіріңізге рахмет!
Бірдеңе дұрыс болмады және сіздің дауысыңыз есептелмеді.
Рақмет сізге. Сіздің хабарламаңыз жіберілді
Мәтіннен қате таптыңыз ба?
Оны таңдаңыз, басыңыз Ctrl+Enterжәне біз оны түзетеміз!