जब आप करते हैं 0[0], तो जेएस दुभाषिया पहले वस्तु 0में बदल जाएगा Numberऔर फिर [0]उस वस्तु की संपत्ति तक पहुंचने का प्रयास करेगा undefined।
कोई सिंटैक्स त्रुटि नहीं है क्योंकि 0[0]इस संदर्भ में भाषा व्याकरण द्वारा संपत्ति एक्सेस सिंटैक्स की अनुमति है। यह संरचना (जावास्क्रिप्ट व्याकरण में शर्तों का उपयोग) हैNumericLiteral[NumericLiteral] ।
ES5 ECMAScript युक्ति के खंड A.3 से भाषा व्याकरण का प्रासंगिक भाग यह है:
Literal ::
NullLiteral
BooleanLiteral
NumericLiteral
StringLiteral
RegularExpressionLiteral
PrimaryExpression :
this
Identifier
Literal
ArrayLiteral
ObjectLiteral
( Expression )
MemberExpression :
PrimaryExpression
FunctionExpression
MemberExpression [ Expression ]
MemberExpression . IdentifierName
new MemberExpression Arguments
तो, एक व्यक्ति इस प्रगति के माध्यम से व्याकरण का पालन कर सकता है:
MemberExpression [ Expression ]
PrimaryExpression [ Expression ]
Literal [ Expression ]
NumericLiteral [ Expression ]
और, इसी तरह Expressionअंतत: NumericLiteralव्याकरण का पालन करने के बाद भी हम ऐसा कर सकते हैं , हम देखते हैं कि इसकी अनुमति है:
NumericLiteral [ NumericLiteral ]
जिसका अर्थ है कि 0[0]यह व्याकरण का एक स्वीकृत हिस्सा है और इस प्रकार कोई वाक्यविन्यास नहीं है।
फिर, रन-टाइम में आपको एक ऐसी संपत्ति को पढ़ने की अनुमति होती है जो मौजूद नहीं होती है (इसे बस के रूप में पढ़ा जाएगा undefined ) जब तक आप जिस स्रोत से पढ़ रहे हैं वह एक वस्तु है या किसी वस्तु का अंतर्निहित रूपांतरण है। और, एक संख्यात्मक शाब्दिक वास्तव में एक वस्तु (एक संख्या वस्तु) के लिए एक अंतर्निहित रूपांतरण है।
यह जावास्क्रिप्ट की उन अज्ञात विशेषताओं में से एक है। प्रकार Number, BooleanऔरStringजावास्क्रिप्ट में आमतौर पर आंतरिक रूप से संग्रहीत होते हैं (पूर्ण-विकसित वस्तुएं नहीं)। ये एक कॉम्पैक्ट, अपरिवर्तनीय भंडारण प्रतिनिधित्व हैं (शायद कार्यान्वयन दक्षता के लिए इस तरह से किया गया है)। लेकिन, जावास्क्रिप्ट चाहता है कि आप इन प्राथमिकताओं का इलाज करने में सक्षम हों जैसे कि गुणों और विधियों के साथ। इसलिए, यदि आप किसी ऐसी संपत्ति या विधि का उपयोग करने की कोशिश करते हैं जो सीधे आदिम पर समर्थित नहीं है, तो जावास्क्रिप्ट अस्थायी रूप से आदिम के मूल्य के लिए निर्धारित मूल्य के साथ एक उपयुक्त प्रकार की वस्तु में आदिम को ले जाएगा।
जब आप किसी ऑब्जेक्ट को सिंटेक्स पर किसी प्राइमरी जैसे सिंटैक्स का उपयोग करते हैं 0[0], तो दुभाषिया एक प्राइमेट पर प्रॉपर्टी एक्सेस के रूप में इसे पहचानता है। इसके लिए इसकी प्रतिक्रिया पहले 0संख्यात्मक आदिम को लेना है और इसे एक पूर्ण विकसित Numberवस्तु में तब्दील करना है, जिस पर वह [0]संपत्ति का उपयोग कर सकता है । इस विशिष्ट मामले में, [0]एक संख्या वस्तु पर संपत्ति undefinedहै यही कारण है कि आप जिस मूल्य से प्राप्त करते हैं 0[0]।
गुणों से निपटने के प्रयोजनों के लिए एक वस्तु के लिए एक आदिम के ऑटो-रूपांतरण पर यहां एक लेख है:
जावास्क्रिप्ट प्रिमिटिव्स का सीक्रेट लाइफ
यहाँ ECMAScript 5.1 विनिर्देशन के प्रासंगिक अंश दिए गए हैं:
9.10 CheckObjectCoercible
यदि मान है undefinedया नहीं null, तो TypeError फेंकता है , अन्यथा वापस लौटता है true।

11.2.1 प्रॉपर्टी ऐक्सेसर्स
- बता दें कि BaseReference सदस्यExpression के मूल्यांकन का परिणाम है।
- BaseValue GetValue (BaseReference) होने दें।
- बता दें कि प्रॉपर्टीनामेप्रेशन एक्सप्रेशन के मूल्यांकन का परिणाम है।
- चलिए PropertyNameValue GetValue (संपत्तिनामप्रदर्शन) करें।
- CheckObjectCoercible (baseValue) को कॉल करें।
- चलिए PropertyNameString ToString (propertyNameValue) है।
- यदि वाक्य-रचना के उत्पादन का मूल्यांकन किया जा रहा है, तो वह सख्त मोड कोड में समाहित है, सख्त को सही होने दें, अन्यथा सख्त को गलत होने दें।
- प्रकार का संदर्भ लौटाएं जिसका आधार मान baseValue है और जिसका संदर्भित नाम गुणनाम है, और जिसका सख्त मोड ध्वज सख्त है।
इस प्रश्न के लिए एक ऑपरेटिव भाग ऊपर चरण # 5 है।
8.7.1 गेटवैल्यू (वी)
यह बताता है कि जब मूल्य का उपयोग किया जा रहा है तो यह एक संपत्ति संदर्भ है, यह ToObject(base)किसी भी आदिम का ऑब्जेक्ट संस्करण प्राप्त करने के लिए कहता है।
9.9 ToObject
यह वर्णन करता है कि कैसे Boolean, Numberऔर Stringआदिम वस्तु को [[PrimitiveValue]] आंतरिक संपत्ति के अनुसार वस्तु रूप में परिवर्तित किया जाता है।
एक दिलचस्प परीक्षण के रूप में, यदि कोड इस तरह था:
var x = null;
var a = x[0];
यह तकनीकी रूप से कानूनी वाक्यविन्यास के रूप में पार्स समय पर एक सिंटेक्सएयर को फेंक नहीं सकता है, लेकिन जब आप कोड चलाते हैं, तो यह रनटाइम पर एक टाइपऑर्डर को फेंक देगा क्योंकि जब उपरोक्त संपत्ति एक्सेसर्स लॉजिक मान पर लागू होता है x, तो यह कॉल CheckObjectCoercible(x)या कॉल करेगा ToObject(x)जो दोनों एक टाइपError फेंक देंगे अगर xहै nullया undefined।
true[0]या""[0]