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

typeof операторын алыңыз. Түрі алу операторы Уақытша өлі аймақтарға қатысты қателер

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 қосу.

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

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

Синтаксис

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

түрі операнд

Параметрлер

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

Сипаттама

Келесі кестеде 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 нұсқасына дейін typeof операторына кез келген операндпен шақырылған жолды қайтаруға кепілдік берілген. Бұл көтермейтін блок ауқымы бар 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 ( класс Қосу ( ) класы Қосынды: ( ) класын қосу Бағдарлама ( статикалық void 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(); ) ) )

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

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-те айнымалы мәндерді тексеру қиындықтарын және оларды айналып өтуді сипаттау үшін жеткілікті қысқа және түсінікті.

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

  • анықталмаған: «анықталмаған»
  • Нөл: "объект"
  • логикалық: "логикалық"
  • Сан: «сан»
  • Жол: «жол»
  • Функция: «функция»
  • Қалғанының бәрі: «нысан»

Осы кестеге келесі ескертулерді қосу керек:

1. typeof null === "объект" .

Теориялық тұрғыдан бұл жерде бір нәзік тұс бар. Статикалық түрде терілген тілдерде нысан түрінің айнымалысы нысанды қамтымауы мүмкін (NULL, нөл, нөлдік көрсеткіш).

Іс жүзінде - JavaScript-те бұл ыңғайсыз. Осылайша, ES 5.1 әзірлеушілері анағұрлым интуитивті нәрсе жасайды: typeof null === "null" .

Бірақ біз әлі де ES3 айналасында болғандықтан, қателеспеңіз, мысалы, бұл туралы:

/* Функция кейбір нысанды іздейді және оны қайтарады немесе ештеңе табылмаса нөлді қайтарады */ function search() () var obj = search(); if (typeof obj === "объект") ( // шынымен де объектіні таптық па (FAIL) obj.method(); )

2. Қаптама нысандары туралы ұмытпаңыз (жаңа Сан(5) === «нысан» түрі).

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

Safari HTMLCollection-ты функция түрі ретінде табанды түрде қабылдайтынына таң қалмаңыз, ал 9-ға дейінгі IE біздің сүйікті alert() функциясын нысан ретінде сақтайды. Сондай-ақ, Chrome бұрын RegExp функциясы деп санайтын, бірақ қазір ол есін жиып, оған нысанмен жауап беретін сияқты.

toString()

Оның toString() әдісінің нәтижесінен мән түрін білуге ​​тырысу мағынасыз. Барлық «сыныптарда» бұл әдіс өзінше қайта анықталады.

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

Object.prototype.toString()

toString нақты «сыныптар» ішінде қайта анықталса да, бізде әлі де оның Object-тен бастапқы іске асырылуы бар. Оны қолдануға тырысайық:

console.log (Нысан .прототипі .toString .call (мән) );

console.log(Object.prototype.toString.call(мән));


Клинтон бұл ауыртпалықты азайтады

Бір қызығы, бұл әдіс таңқаларлық жақсы жұмыс істейді.

Скаляр түрлері үшін , , , қайтарады.

Бір қызығы, бұл жерде сәтсіз аяқталатын жаңа Number(5) да қайтарылады.

Нөл және анықталмаған күйде әдіс сәтсіз болады. Әртүрлі браузерлер күтілетін және , немесе , немесе тіпті . Дегенмен, бұл екі мәннің түрін онсыз анықтау оңай.

Қызықты нәрсе біз объектілерге жеткенде басталады (typeof === «нысан»).

Кірістірілген нысандар іс жүзінде соққымен жұмыс істейді:

  • {} —
  • күні-
  • қате-
  • regexp-

Аргументтер тізімінен шығарылатын жалғыз нәрсе, ол , немесе .
Хост-нысандармен бәрі қайтадан нашарлайды.

IE-де DOM нысандары тек 8-ші нұсқадан бастап «қалыпты» нысандарға айнала бастады, содан кейін соңына дейін емес. Сондықтан, IE 6-8-де бұл нысандардың барлығы (HTMLCOllection, DOMElement, TextNode, сонымен қатар құжат және терезе) жай ғана түрленеді.

Барлық басқа браузерлерде (соның ішінде IE9) toString нәтижесімен бірдеңе жасауға болады. Барлығы да оңай болмаса да: HTMLCollection бар, содан кейін . терезе - содан кейін, содан кейін, содан кейін. Бірақ сіз одан бірдеңе алуға тырысуға болады.

DOMElement көмегімен қиынырақ: ол әр тег үшін басқа пішім ретінде көрсетіледі. Бірақ бұл жерде бізге тұрақты маусым көмектеседі.

Басқа хост нысандарымен (орын және навигатор сынақтарында) оқиға шамамен бірдей. IE-ден басқа барлық жерде оларды жол арқылы анықтауға болады.

Object.prototype.toString() пайдаланудың минустарынан:

1. Бұл мүмкіндік стандартпен бекітілмеген. Біз бұл жерде бәрі жақсы жұмыс істеп жатқанына қуануымыз керек және кейбір кемшіліктерге өкінбейміз.

2. Типті анықтауға мүлдем жатпайтын, тіпті оған қатысы жоқ объектіге де шақырылған әдіспен қайтарылған жолды талдау арқылы түрін анықтау жанға біраз тұнба қалдырады.

3. Ескі IE-де, көріп отырғаныңыздай, хост-объектілер әдетте анықталмайды.

Дегенмен, бұл басқа құралдармен бірге қолданылғанда өте жұмыс істейтін нәрсе.


Конструкторлар

Соңында, конструкторлар. JS-тегі объектінің «сыныбы» туралы оның конструкторынан гөрі кім жақсы айта алады?

null және undefined орауыш нысандары да, конструкторлары да жоқ.

Қалған скаляр түрлерінде орауыштар бар, сондықтан конструкторды алуға болады:

(5) .конструктор === Сан ; (Number .NaN ) .конструктор === Сан ; (шын) .конструктор === логикалық ; («жол») .constructor === Жол ;

(5).конструктор === Сан; (Number.NaN).конструктор === Сан; (шын).конструктор === Логикалық; («жол»).конструктор === Жол;

Бірақ instanceof мұнда жұмыс істемейді:

5 instanceofNumber; // жалған Number .NaN instanceof Number ; // жалған шын данасы Boolean ; // жалған "жол" данасы String ; // жалған

5 instanceofNumber; // жалған Number.NaN данасы Number; // логикалық қате шын данасы; // жолдың жалған "жол" данасы; // жалған

(Instanceof көп шыдамды жаңа Сан үшін жұмыс істейді(5))

Функциялармен (олар да нысандар болып табылады) instanceof мыналарды орындайды:

console.log ((функция () ( ) ) instanceof Function ); // шын консоль. log ((функция () ( ) ) .конструктор === Функция ); // шын

console.log((функция () ()) функцияның instanceof); // true console.log((функция () ()).конструктор === Функция); // шын

Кірістірілген сыныптардың барлық нысандарын конструкторлар да оңай анықтайды: Array , Date , RegExp , Error .

Бұл жерде конструкторы Object болып табылатын аргументтермен бір мәселе туындайды.

Ал екіншісі Нысанның өзімен, дәлірек айтсақ, оған теңшелетін конструктор арқылы жасалған нысанға қалай сілтеме жасау керек.

Тек негізгі нысанды келесідей анықтауға болады:

obj instanceofObject;

Анықтау опцияларының бірі ретінде барлық басқа мүмкін түрлерді қайталаңыз (Массив , Қате ...) және егер олардың ешқайсысы сәйкес келмесе - "нысан".

Конструкторлар және хост объектілері

Хост нысандарымен жағдай нашарлайды.

IE 7-ші нұсқасын қоса алғанда, оларды мүлдем қалыпты нысандар деп санамайтындығынан бастайық. Оларда жай ғана конструкторлар мен прототиптер жоқ (кез келген жағдайда бағдарламашы оларға жете алмайды).

Басқа браузерлерде бәрі жақсырақ. Конструкторлар бар және олардан мән класын анықтауға болады. Тек олар әртүрлі браузерлерде басқаша аталады. Мысалы, HTMLCollection үшін конструктор HTMLCollection немесе NodeList немесе тіпті NodeListConstructor болады.

Сондай-ақ DOMElement үшін негізгі конструкторды анықтау керек. FF ішінде бұл, мысалы, HTMLDivElement және басқалары мұраға алған HTMLElement.

Трикті FireFox 10-нұсқадан төмен және Opera 11-нұсқадан төмен жібереді. Мұнда коллекция конструкторы Object болып табылады.

constructor.name

Сондай-ақ, конструкторларда пайдалы болуы мүмкін атау сипаты бар.

Ол конструктор функциясының атауын қамтиды, мысалы, (5).constructor.name === "Сан" .

Бірақ:
1. IE-де ол мүлдем жоқ, тіпті 9-да.
2. Хост-объектілерде браузерлер көп нәрсенің бәрін қайтадан қалыпқа келтіреді (және көбінесе оларда бұл қасиет мүлде болмайды). Operaда DOMElement жалпы Function.prototype конструкторының атауына ие.
3. аргументтер қайтадан «объект».

қорытындылар

Ұсынылған әдістердің ешқайсысы барлық браузерлердегі мән түрінің/сыныбының 100% анықтамасын бермейді. Дегенмен, олар бірге мұны істеуге мүмкіндік береді.

Жақын арада мен барлық деректерді кестелерде жинауға тырысамын және анықтаушы функцияның мысалын келтіремін.

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