Гэр / Компьютер эзэмших / Javascript шалгах хувьсагчийн төрөл. operator typeof авах

Javascript шалгах хувьсагчийн төрөл. operator typeof авах

JavaScriptэсвэл JS(богинохон) хэл нь тийм ч хялбар биш бөгөөд шинэхэн хөгжүүлэгчид энэ талаар шууд сурахгүй. Эхлээд тэд үндсийг сурч, бүх зүйл өнгөлөг, үзэсгэлэнтэй мэт санагддаг. Жаахан гүнзгийрвэл тэнд байгаа JavaScript массивууд, объектууд, дуудлагууд болон бусад бүх зүйл нь ихэвчлэн оюун ухаанд цохилт өгдөг.

JavaScript-д хувьсагчийн төрлийг зөв шалгах нь чухал. Хувьсагч нь массив эсвэл объект мөн эсэхийг мэдэхийг хүсч байна гэж бодъё? Үүнийг хэрхэн зөв шалгах вэ? Энэ тохиолдолд баталгаажуулалтын явцад заль мэх байдаг бөгөөд энэ нийтлэл нь энэ тухай байх болно. Одоо шууд эхэлцгээе.

Хувьсагчийн төрлийг шалгаж байна

Жишээлбэл, хувьсагч нь объект, массив, мөр эсвэл тоо эсэхийг шалгах хэрэгтэй. Та үүний тулд typeof-г ашиглаж болно, гэхдээ энэ нь танд үргэлж үнэнийг хэлэхгүй бөгөөд яагаад гэдгийг би доорх жишээн дээр харуулах болно.

Typeof яагаад үргэлж зөв сонголт байдаггүйг харуулахын тулд би энэ жишээг бичсэн.

Var _comparison = ( string: "string", int: 99, float: 13.555, объект: (сайн байна уу: "сайн уу"), массив: new Array(1, 2, 3) ); // Объектын түлхүүрүүд бүхий массивыг буцаана var _objKeys = Объект. keys(_харьцуулалт); 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);

Тохиромжтой функцийн сүүлчийн үр дүн:

Function isArray(өгөгдөл) ( Object.prototype.toString.call(өгөгдөл) == "" буцаана)

Одоо та isArray() функцуудыг дуудаж, аргумент болгон массив эсвэл ямар нэг зүйлийг тохируулаад үр дүнг харах боломжтой.

Дараах үг

Бичлэг нь анх төлөвлөснөөс нэлээд том хэмжээтэй болсон. Гэхдээ энэ нь JavaScript дээр хувьсагчдыг баталгаажуулахад тулгарч буй бэрхшээл, тэдгээрийг хэрхэн тойрч гарахыг тайлбарлахад хангалттай товч бөгөөд ойлгомжтой учраас би үүнд баяртай байна.

Хэрэв танд асуух зүйл байвал энэ нийтлэлийн доор бичээрэй. Би туслахдаа баяртай байх болно.

a = (b > 0) && (c + 1 != d); туг =!(статус = 0);

Хүснэгт 14.5. Логик операторууд

Операторын тодорхойлолт

! БИШ (логик урвуу)

&& БА (логийн үржүүлэх)

|| OR (логик нэмэлт)

Хүснэгт 14.6. AND болон OR операторуудыг гүйцэтгэх үр дүн

Операнд 1

Операнд 2

Хүснэгт 14.7. NOT мэдэгдлийг гүйцэтгэсний үр дүн

operator typeof авах

Төрөл операторыг авна уу typeof нь операндын өгөгдлийн төрлийг тодорхойлсон мөрийг буцаана. Төрөл нь олдох операндыг энэ операторын ард байрлуулж, хаалтанд бичнэ.

s = typeof("str");

Энэ илэрхийллийн үр дүнд s хувьсагч нь мөрийн төрлийг илэрхийлэх "string" мөрийг агуулна.

Төрөл операторын буцааж өгч болох бүх утгыг Хүснэгт 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-ийн утга -тэй тэнцүү болно.

Логик утгуудыг тоон эсвэл мөрийн утга болгон хөрвүүлдэг. Үнэнийг 1 тоо эсвэл "1" мөр рүү, худал нь 0 эсвэл "0" руу хөрвүүлнэ. Үүний эсрэгээр 1-ийн тоог үнэн, 0-ийн тоог худал болгон хувиргах болно. Мөн худал нь хөрвүүлэгдэх болно

Бид хоосон бөгөөд тодорхойгүй байна.

III хэсэг. Вэб хуудасны зан байдал. Вэб скриптүүд

JavaScript нь буруу бичсэн илэрхийллийг ч зөв гүйцэтгэхийн тулд тэмцэж байгааг харж болно. Заримдаа энэ нь ажилладаг, гэхдээ ихэнхдээ бүх зүйл төлөвлөсний дагуу болохгүй, эцэст нь скриптийн огт өөр газар, туйлын зөв мэдэгдэл дээр алдаа олдсон тул вэб скриптийг зогсоодог. Тиймээс ийм тохиолдлоос зайлсхийх нь дээр.

Операторын давуу эрх

Энд бидний шийдвэрлэх хамгийн сүүлийн асуудал бол операторын давуу эрх юм. Бидний санаж байгаагаар давуу байдал нь илэрхийлэл дэх операторуудыг гүйцэтгэх дараалалд нөлөөлдөг.

Дараах илэрхийлэл байх болтугай.

Энэ тохиолдолд эхлээд c-ийн утгыг b хувьсагчийн утга дээр нэмж, дараа нь нийлбэрээс 10-ыг хасна.Энэ илэрхийллийн операторууд ижил давуу эрхтэй тул зүүнээс баруун тийш хатуу гүйцэтгэнэ.

Одоо энэ илэрхийллийг авч үзье:

Энд эхлээд c утгыг 10-аар үржүүлж, зөвхөн дараа нь үүссэн бүтээгдэхүүнд b утгыг нэмнэ. Үржүүлэх оператор нь нэмэх оператороос илүү давуу эрхтэй байдаг тул "хатуу зүүнээс баруун тийш" гэсэн дарааллыг зөрчих болно.

Даалгаврын операторууд хамгийн бага давуу эрхтэй. Тийм ч учраас эхлээд илэрхийлэл өөрөө үнэлэгдэж, дараа нь түүний үр дүнг хувьсагчид оноож өгдөг.

AT Ерөнхийдөө бүх операторуудыг гүйцэтгэх үндсэн зарчим нь дараах байдалтай байна: нэгдүгээрт, илүү өндөр ач холбогдол бүхий операторууд, зөвхөн дараа нь - доод операторууд ажиллана. Ижил давуу эрх бүхий операторууд гарч ирэх дарааллаар (зүүнээс баруун тийш) гүйцэтгэгдэнэ.

AT таб. 14.9-д бидний судалсан бүх операторуудыг эрэмбэлэх дарааллаар нь жагсаав.

Хүснэгт 14.9. Операторын давуу эрх (буурах дарааллаар)

Операторууд

Тодорхойлолт

++ -- - ~! төрөл

Өсөх, бууруулах, тэмдгийн өөрчлөлт, логик ҮГҮЙ, төрөл дүгнэлт

Үржүүлэх, хуваах, үлдэгдэл

Мөр нэмэх ба холбох, хасах

Харьцуулах операторууд

логик БА

Бүлэг 14. Вэб програмчлалын танилцуулга. JavaScript хэл

Хүснэгт 14.9 (төгсгөл)

Операторууд

Тодорхойлолт

Логик OR

Нөхцөлт оператор (доороос үзнэ үү)

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

Даалгавар, энгийн бөгөөд төвөгтэй

АНХААР!

Энэ хүснэгтийг санаарай. Мэдэгдэлийн буруу дараалал нь илрүүлэхэд хэцүү алдааг үүсгэдэг бөгөөд энэ нь туйлын зөв илэрхийлэл нь буруу үр дүнг өгдөг.

Гэхдээ бид мэдэгдлийн гүйцэтгэлийн ердийн дарааллыг зөрчих шаардлагатай бол яах вэ? Хаалт ашиглацгаая. Энэ тэмдэглэгээнд эхлээд хаалтанд орсон хэллэгүүдийг гүйцэтгэнэ:

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-г нэмж, c ба 10-ыг үржүүлнэ.

4. Хуваалтаас гарсан хэсгийн нийлбэрээс хасах d - 2.

5. Үүссэн зөрүү дээр 9-ийг нэмнэ.

Энэ нь шал өөр үр дүн болж байна, тийм үү?

Оператор төрөлоперандын төрлийг харуулсан мөрийг буцаана.

Синтакс

Операнд нь төрлийн операторын дагуу байна:

төрөл операнд

Сонголтууд

операнднь төрлийг нь буцаах объект эсвэл командыг илэрхийлэх илэрхийлэл юм.

Тодорхойлолт

Дараах хүснэгтэд typeof-ийн буцах боломжит утгуудыг жагсаав. Нэмэлт мэдээлэлтөрөл ба командуудын тухай хуудас дээр байна.

Жишээ

// Numbers typeof 37 === "тоо"; typeof 3.14 === "тоо"; typeof(42) === "тоо"; typeof Math.LN2 === "тоо"; typeof Infinity === "тоо"; typeof NaN === "тоо"; // Хэдийгээр энэ нь "Тоо биш" төрлийн Number(1) === "тоо"; // энэ тэмдэглэгээг хэзээ ч ашиглахгүй! // strings typeof "" === "string"; typeof "bla" === "string"; typeof "1" === "мөр"; // тэмдэгт мөр доторх тоо string typeof (typeof 1) хэвээр байгааг анхаарна уу === "string"; // typeof энэ тохиолдолд үргэлж мөр буцаана typeof String("abc") === "string"; // энэ тэмдэглэгээг хэзээ ч ашиглахгүй! // Boolean typeof true === "boolean"; typeof false === "boolean"; typeof Boolean(үнэн) === "boolean"; // энэ тэмдэглэгээг хэзээ ч ашиглахгүй! // Symbols typeof Symbol() === "тэмдэг" typeof Symbol("foo") === "тэмдэг" typeof Symbol.iterator === "тэмдэг" // Тодорхойгүй төрөл тодорхойгүй === "тодорхойгүй"; typeof declaredButUndefinedVariable === "тодорхойгүй"; typeof undeclaredVariable === "тодорхойгүй"; // Objects typeof(a: 1) === "объект"; // ердийн объект болон массивыг ялгахын тулд Array.isArray эсвэл Object.prototype.toString.call // ашиглана. typeof === "объект"; typeof new Date() === "объект"; // Доорх бүх зүйл нь алдаа, асуудалд хүргэдэг. Хэрэглэж болохгүй! typeof new Boolean(үнэн) === "объект"; typeof new Number(1) === "объект"; typeof new String("abc") === "объект"; // Functions typeof function() () === "функц"; typeof анги C() === "функц"; typeof Math.sin === "функц";

null

// Энэ нь JavaScript төрснөөс хойш тодорхойлогдсон typeof null === "объект";

JavaScript-ийн анхны хэрэгжилтэд утгуудыг шошгын төрөл ба утгын хосоор илэрхийлсэн. Объектуудын шошгын төрөл нь 0 байсан. null нь null заагчаар илэрхийлэгдсэн (ихэнх платформ дээр 0x00). Иймээс null-ийн тагийн төрөл null байсан тул typeof-ийн буцаах утга нь хуурамч байна. ()

Засварыг ECMAScript-д (идэвхгүй болгох замаар) санал болгосон боловч татгалзсан. Үүний үр дүнд typeof null === "null" гарч ирнэ.

Шинэ оператор ашиглаж байна

// "Шинэ"-ээр үүсгэгдсэн бүх бүтээгч функцууд нь "объект" төрлийн байх болно var str = new String("String"); var num = new Number(100); typeofstr; // "объект"-ыг буцаана typeof 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 undeclaredVariable === "тодорхойгүй"; newLetVariable төрөл; newLetVariable-г зөвшөөрөх; // newConstVariable-ийн ReferenceError type; const newConstVariable = "сайн уу"; // Лавлагааны алдаа

Үл хамаарах зүйл

Одоогийн бүх хөтөч дээр Undefined төрлийн стандарт бус document.all хост объект байдаг.

typeof document.all === "тодорхойгүй";

Хэдийгээр техникийн үзүүлэлтүүд нь стандарт бус чамин объектуудад тусгай төрлийн нэр өгөхийг зөвшөөрдөг ч эдгээр нэр нь урьдчилан тодорхойлсоноос өөр байх шаардлагатай. Document.all нь тодорхойгүй төрөлтэй байгаа нөхцөл байдал нь дүрмийг онцгой зөрчсөн гэж үзэх ёстой.

Үзүүлэлтүүд

Тодорхойлолт Статус Сэтгэгдэл
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 вэб үзэх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-д олон хост объектууд нь функц биш харин объект юм. Жишээлбэл.

  • тодорхойгүй: "тодорхойгүй"
  • Null: "объект"
  • Boolean: "boolean"
  • Тоо: "тоо"
  • Мөр: "мөр"
  • Чиг үүрэг: "функц"
  • Бусад бүх зүйл: "объект"

Энэ хүснэгтэд дараах тайлбарыг нэмж оруулах шаардлагатай.

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

Онолын хувьд энд нэг нарийн зүйл бий. Статик хэлбэрээр бичсэн хэлнүүдийн хувьд объектын төрлийн хувьсагч нь объект агуулаагүй байж болно (NULL, nil, null заагч).

Практикт - JavaScript-д энэ нь тохиромжгүй байдаг. Тиймээс ES 5.1 хөгжүүлэгчид илүү ойлгомжтой зүйл хийх гэж байна: typeof null === "null" .

Гэхдээ бид ES3-ийн эргэн тойронд байгаа тул алдаа гаргах хэрэггүй, жишээлбэл:

/* Функц нь зарим объектыг хайдаг бөгөөд хэрэв юу ч олдохгүй бол түүнийг буцаана эсвэл null өгнө */ function search() () var obj = search(); if (typeof obj === "объект") ( // бид үнэхээр объектыг олсон уу (FAIL) obj.method(); )

2. Боодолтой объектуудын тухай бүү март (typeof new Number(5) === "объект").

3. Хөтөчүүд хост-объектуудтай юу ч хийх эрхийг мартаж болохгүй.

Safari нь HTMLCollection-ийг функцийн төрөл гэж зөрүүдлэн авч үздэг бөгөөд 9-р өмнөх IE нь бидний дуртай alert() функцийг объект болгон хадгалж байгаад бүү гайхаарай. Мөн Chrome өмнө нь RegExp-ийг функц гэж үздэг байсан бол одоо ухаан орж, түүнд объектоор хариу үйлдэл үзүүлэх шиг боллоо.

toString()

Түүний toString() аргын үр дүнгээс утгын төрлийг олох гэж оролдох нь утгагүй юм. Бүх "анги" -д энэ аргыг өөрийн гэсэн байдлаар дахин тодорхойлдог.

Энэ арга нь дибаг хийх мэдээллийг харуулахад тохиромжтой боловч үүнээс хувьсагчийн төрлийг тодорхойлох боломжгүй.

Object.prototype.toString()

Хэдийгээр toString нь тодорхой "анги" дотор хүчингүй болсон ч бид Объектоос анхны хэрэгжилтийг нь хадгалсаар байна. Үүнийг ашиглахыг хичээцгээе:

console.log ( Объект .прототип .toString .дуудлага (утга) );

console.log(Object.prototype.toString.call(утга));


Клинтон энэ ачааг шингэлж байна

Хачирхалтай нь, энэ арга нь гайхалтай сайн ажилладаг.

Скаляр төрлийн хувьд , , , буцаана.

Хамгийн инээдтэй нь энд амжилтгүй болсон шинэ Number(5) хүртэл буцаж ирдэг.

null болон тодорхойгүй үед арга амжилтгүй болно. Янз бүрийн хөтчүүд хүлээгдэж буй болон , эсвэл , эсвэл бүр гэсэн хариултыг өгдөг. Гэсэн хэдий ч үүнгүйгээр эдгээр хоёр утгын төрлийг тодорхойлоход хялбар байдаг.

Сонирхолтой зүйлс нь объект руу (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) .constructor === Number ; (Тоо .NaN ) .constructor === Number ; (үнэн) .constructor === Boolean ; ("string") .constructor === String ;

(5).конструктор === Тоо; (Тоо.NaN).constructor === Тоо; (үнэн).байгуулагч === Boolean; ("string").constructor === String;

Гэхдээ instanceof энд ажиллахгүй:

5 instanceofNumber; // худал Тоо .NaN instanceof Number ; // Boolean худал үнэн жишээ; // худал "string" instanceof String ; // худал

5 instance of Number; // худал Number.NaN instanceof Number; // Boolean худал үнэн жишээ; // String-ийн худал "мөр" жишээ; // худал

(instanceof нь удаан хүлээсэн шинэ Дугаар(5) ажиллах болно)

Функцуудын хувьд (энэ нь мөн объектууд) instanceof нь дараахь зүйлийг хийх болно.

консол.log ( (функц () ( ) ) instanceof Function ); // үнэн консол. log ( (функц () ( ) ) .constructor === Function ); // үнэн

console.log((функц () ()) instanceof Function); // true console.log((функц () ()).constructor === Функц); // үнэн

Суурилуулсан ангиудын бүх объектыг бүтээгчид хялбархан тодорхойлдог: Array , Date , RegExp , Error .

Баригч нь Объект болох аргументуудтай холбоотой нэг асуудал энд гарч ирнэ.

Хоёрдахь нь Объект өөрөө, эс тэгвээс өөрчлөн бүтээгчээр үүсгэгдсэн объектыг түүн рүү хэрхэн холбох талаар.

Зөвхөн үндсэн объектыг дараах байдлаар тодорхойлж болно.

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. Host-objects-д хөтчүүд их байгаа бүх зүйлийг дахин хөгцрүүлдэг (мөн ихэнхдээ тэдэнд энэ өмч огт байдаггүй). Opera дээр DOMElement нь Function.prototype ерөнхийд нь бүтээгчийн нэртэй байдаг.
3. аргументуудыг дахин " объект ".

дүгнэлт

Үзүүлсэн аргуудын аль нь ч бүх хөтөч дээрх утгын төрөл / ангиллын 100% тодорхойлолтыг өгдөггүй. Гэсэн хэдий ч тэд хамтдаа үүнийг хийхийг зөвшөөрдөг.

Ойрын ирээдүйд би бүх өгөгдлийг хүснэгтэд цуглуулж, тодорхойлох функцийн жишээг өгөхийг хичээх болно.