मूल बातें
आप इसे नहीं जानते होंगे, लेकिन जावास्क्रिप्ट में, जब भी हम स्ट्रिंग, नंबर या बूलियन प्राइमेट के साथ बातचीत करते हैं, तो हम ऑब्जेक्ट शैडो और कॉर्शन की एक छिपी दुनिया में प्रवेश करते हैं।
स्ट्रिंग, संख्या, बूलियन, अशक्त, अपरिभाषित और प्रतीक।
जावास्क्रिप्ट में 7 आदिम प्रकार के होते हैं: undefined, null, boolean, string, number, bigintऔर symbol। बाकी सब एक वस्तु है। आदिम प्रकार boolean, stringऔर numberउनके वस्तु समकक्षों द्वारा लिपटे जा सकते हैं। इन वस्तुओं के उदाहरण हैं Boolean, Stringऔर Numberक्रमशः कंस्ट्रक्टर्स।
typeof true; //"boolean"
typeof new Boolean(true); //"object"
typeof "this is a string"; //"string"
typeof new String("this is a string"); //"object"
typeof 123; //"number"
typeof new Number(123); //"object"
यदि आदिमों के पास कोई गुण नहीं है, तो "this is a string".lengthमान क्यों लौटाता है?
क्योंकि जावास्क्रिप्ट आसानी से आदिम और वस्तुओं के बीच तालमेल बैठाएगा। इस मामले में संपत्ति की लंबाई तक पहुंचने के लिए स्ट्रिंग मान को एक स्ट्रिंग ऑब्जेक्ट के लिए मजबूर किया जाता है। स्ट्रिंग ऑब्जेक्ट केवल दूसरे के एक अंश के लिए उपयोग किया जाता है जिसके बाद इसे कचरा संग्रह के देवताओं को बलिदान किया जाता है - लेकिन टीवी खोज की भावना से पता चलता है, हम मायावी प्राणी को फँसाएंगे और इसे आगे के विश्लेषण के लिए संरक्षित करेंगे ...
इसे प्रदर्शित करने के लिए आगे के उदाहरण पर विचार करें जिसमें हम स्ट्रिंग कंस्ट्रक्टर प्रोटोटाइप में एक नई संपत्ति जोड़ रहे हैं।
String.prototype.sampleProperty = 5;
var str = "this is a string";
str.sampleProperty; // 5
इसके द्वारा आदिमों के पास उनके संबंधित ऑब्जेक्ट कंस्ट्रक्टर्स द्वारा परिभाषित सभी गुणों (विधियों सहित) तक पहुंच होती है।
इसलिए हमने देखा कि जब आवश्यक हो तो आदिम प्रकार उनके संबंधित वस्तु समकक्ष के लिए उचित रूप से मोटे होंगे।
toString()विधि का विश्लेषण
निम्नलिखित कोड पर विचार करें
var myObj = {lhs: 3, rhs: 2};
var myFunc = function(){}
var myString = "This is a sample String";
var myNumber = 4;
var myArray = [2, 3, 5];
myObj.toString(); // "[object Object]"
myFunc.toString(); // "function(){}"
myString.toString(); // "This is a sample String"
myNumber.toString(); // "4"
myArray.toString(); // "2,3,5"
जैसा कि ऊपर चर्चा की गई है, वास्तव में क्या हो रहा है जब हम toString()एक आदिम प्रकार पर विधि कहते हैं , तो विधि को लागू करने से पहले इसे अपने ऑब्जेक्ट समकक्ष में समेटना पड़ता है।
यानी myNumber.toString()के बराबर है Number.prototype.toString.call(myNumber)और इसी तरह अन्य आदिम प्रकार के लिए।
लेकिन क्या होगा यदि आदिम प्रकार के बजाय toString()इसके संबंधित ऑब्जेक्ट निर्माता फ़ंक्शन समकक्ष की विधि में पारित किया जाए , तो हम toString()ऑब्जेक्ट फ़ंक्शन कंस्ट्रक्टर ( Object.prototype.toString.call(x)) की पद्धति पर आदिम प्रकार को पैरामीटर के रूप में पारित करने के लिए मजबूर करते हैं ?
Object.prototyp.toString () पर करीब से देखें
दस्तावेज़ीकरण के अनुसार , जब toString विधि कहा जाता है, तो निम्न कदम उठाए जाते हैं:
- यदि
thisमान है undefined, तो वापस लौटें "[object Undefined]"।
- यदि
thisमान है null, तो वापस लौटें "[object Null]"।
- यदि यह मान उपरोक्त में से कोई नहीं है, तो मान के रूप
Oमें कॉलिंग का परिणाम तर्क के रूप में दें।toObjectthis
- कक्षा को
[[Class]]आंतरिक संपत्ति का मान होने दें O।
- स्ट्रिंग मान तीन तार श्रृंखलाबद्ध का परिणाम है कि लौटें
"[object ", classऔर "]"।
इसे निम्नलिखित उदाहरण से समझें
var myObj = {lhs: 3, rhs: 2};
var myFunc = function(){}
var myString = "This is a sample String";
var myNumber = 4;
var myArray = [2, 3, 5];
var myUndefined = undefined;
var myNull = null;
Object.prototype.toString.call(myObj); // "[object Object]"
Object.prototype.toString.call(myFunc); // "[object Function]"
Object.prototype.toString.call(myString); // "[object String]"
Object.prototype.toString.call(myNumber); // "[object Number]"
Object.prototype.toString.call(myArray); // "[object Array]"
Object.prototype.toString.call(myUndefined); // "[object Undefined]"
Object.prototype.toString.call(myNull); // "[object Null]"
संदर्भ:
https://es5.github.io/x15.2.html#x15.2.4.2
https://es5.github.io/x9.html#x9.9
https://javascriptweblog.wordpress.com/ 2010/09/27 /-गुप्त जीवन के- जावास्क्रिप्ट-पुरातन /