Skip to content

Latest commit

 

History

History
46 lines (35 loc) · 4.49 KB

Enhancing Type Identification.hy.md

File metadata and controls

46 lines (35 loc) · 4.49 KB

Ստեղծենք ՖՈՒՆԿՑԻԱ, որը շատ ավելի ճշգրիտ է աշխատում և անհամեմատ օգտակար է, քան typeof օպերատորը

typeof օպերատորի միջոցով տվյալների տիպը որոշելու ժամանակ բոլոր օբյեկտային (հղումային) տիպերի համար վերադարձվում է "object", լինի դա սովորական օբյեկտ, զանգված, Map թե Set. Մեր ստեղծած Ֆունկցիան պետք է ճշգրիտ ցույց տա թե օբյեկտային տիպի կոնկրետ ո՞ր դասին են պատկանում տվյալները և կարողանա տարբերել օրինակ զանգվածը՝ Map-ից

Ինչպես գիտենք ECMAScript 2023 կամ համառոտ՝ ES14 ստանդարտով JavaScript-ում կան 7 պրիմիտիվ և մեկ օբյեկտային (reference type) տվյալների տեսակներ։(Իրականում ամեն ինչ մի փոքր այլ է, և JS-ում չկան պրիմիտիվ տիպեր այն իմաստով, ինչ մի շարք այլ ծրագրավորման լեզուներում է, և մի շարք այսպես կոչված «պրիմիտիվ» տիպեր JS-ում հանդիսանում են ուղղակի անփոփոխելի օբյեկտներ, բայց դա արդեն այլ ծավալուն թեմա է)։ Օբյեկտային տիպը իր հերթին բաժանվում է մի քանի դասերի։ Օրինակ թե՛ Array-ը, թե՛ Function-ը, թե՛ Map-ն ու Set-ը համարվում են օբյեկտներ։ Երբ մենք տվյալների տիպը որոշելու համար օգտագործում ենք typeof օպերատորը, այն երբեմն իրոք հարմար չէ, որովհետև նա մեզ ինֆորմացիա չի տալիս, թե կոնկրետ ինչ դասի օբյեկտ է ստուգվողը։ Բացի դրանից typeof օպերատորը Null տիպը ստուգելուց վերադարձնում է "object", ինչը նույնպես կարող է թյուրիմացությունների պատճառ դառնալ։

Այժմ փորձենք ստեղծել ֆունկցիա, որը չի ունենա typeof օպերատորի թերությունները, և օգտակար կլինի լայն սպեկտրով խնդիրների լուծման համար։

Տարբեր արժեքների վրա Օբյեկտի նախատիպի (Object.prototype) toString մեթոդի կանչը վերադարձնում է տարբեր արդյունքներ։ Օրինակ՝

Object.prototype.toString.call("hello"); // "[object String]"
Object.prototype.toString.call(888); // "[object Number]"
Object.prototype.toString.call({}); // "[object Object]"
Object.prototype.toString.call(/abc/); // "[object RegExp]"
Object.prototype.toString.call(new Date()); // "[object Date]"

Այսպիսով ինչպես տեսնում ենք մեթոդը միշտ վերադարձնում է սթրինգ, որի առաջին բառը դա object-ն է, իսկ երկրորդը թե այն ինչ դասի է պատկանում։ Փաստորեն եթե մենք օգտագործենք regular expression կամ սթրինգի slice մեթոդը, կարող ենք կտրել վերադարձվող արժեքի մեզ ոչ անհրաժեշտ մասերը, և ստանալ թե կոնկրետ ինչ դասի է պատկանում արժեքը, որը մենք ստուգում ենք։ Ես կօգտագործեմ slice մեթոդը։ Եվ այսպիսով ֆունկցիայի վերջնական տեսքը կլինի՝

function toRawType(value) {
  const _toString = Object.prototype.toString;
  const str = _toString.call(value);
  return str.slice(8, -1);
}

Կարող ենք ևս մի քիչ կրճատել կոդի ծավալը՝ օգտագործելով arrow function: Կարծում եմ այն շարունակում է մնալ նույնքան հասկանալի, որքան վերևի օրինակը։

const toRawType = (value) => Object.prototype.toString.call(value).slice(8, -1);

Իսկ հիմա փորձենք աշխատացնել ֆունկցիան․

toRawType([1, 2, 3]); // "Array"
toRawType({ color: "red" }); // "Object"
toRawType(123); // "Number"
toRawType("Hello, World!"); // "String"
toRawType(true); // "Boolean"
toRawType(function () {}); // "Function"
toRawType(null); // "Null"
toRawType(undefined); // "Undefined"