क्या आप समझा सकते हैं कि जावास्क्रिप्ट अभिव्यक्ति कैसे:जावास्क्रिप्ट अभिव्यक्ति [1 [{}]] पार्स वास्तव में कैसे करता है?
[1 [{}]]
पार/मूल्यांकन करता है? फ़ायरफ़ॉक्स, क्रोम, कॉन्करर, और गैंडो में, ऐसा लगता है कि एक तत्व, undefined
के साथ एक सरणी बनाना है। हालांकि, मुझे समझ में नहीं आता क्यों।
फ़ायरफ़ॉक्स में:
[1 [{}]].toSource()
[(void 0)]
अन्य जावास्क्रिप्ट मानों के साथ 1 को प्रतिस्थापित करना एक ही परिणाम उत्पन्न करता प्रतीत होता है।
अद्यतन: मुझे लगता है कि अब मैं समझता हूं। कोडेका, एड्रियन, और सीएमएस ने चीजों को स्पष्ट किया। मानक तक, मैंने ईसीएमएस्क्रिप्ट 5 के माध्यम से चलने की कोशिश की। Xzx85
1 [{}]
एक संपत्ति एक्सेसर है, इसलिए यह §11.2.1 में शामिल है।baseReference
1
का मूल्यांकन करने का परिणाम है, फिर भी1
।baseValue = GetValue(baseReference) == 1
।GetValue
(§8.7.1) पर,Type(1)
Reference
नहीं है (एक हल नाम बाध्यकारी), तो वापस 1.propertyNameReference
{}
का मूल्यांकन करने का परिणाम है, इसलिए एक खाली वस्तु।propertyNameValue = GetValue(propertyNameReference) == {}
CheckObjectCoercible(baseValue)
(§9.10) पर, हम वापस आते हैं (संख्या ऑब्जेक्ट-कोर्सीबल है)।propertyNameString = ToString(propertyNameValue)
ToString
(§9.8) पर,ToString(ToPrimitive({}, hint String))
ToPrimitive
(§9.1) पर लौटें, ऑब्जेक्ट के[[DefaultValue]]
का परिणाम परिणामPreferredType
(स्ट्रिंग) गुजर रहा है।[[DefaultValue]]
(§8.12.8) पर,[[Get]]
का तर्कtoString
के साथ होने दें।- यह
"[object " + [[Class]] + "]"
को वापस करने के लिए §15.2.4.2 पर परिभाषित किया गया है, जहां[[Class]]
डिफ़ॉल्ट ऑब्जेक्ट प्रोटोटाइप के लिए "ऑब्जेक्ट" है। - चूंकि एक कॉल करने योग्य
toString
है, इसलिए हम इसेthis
{}
होने के साथ तर्क कहते हैं। Reference
प्रकार का मान लौटाएं, जिसका आधार मानBaseValue
(1) है और जिसका संदर्भित नामpropertyNameString
("[object Object]"
) है।
फिर हम ऐरे प्रारंभकर्ता (§11.1.4) पर जाते हैं, और परिणाम के साथ एक एकल तत्व सरणी बनाते हैं।
मुझे यकीन है कि क्यों यह वैध होगा जावास्क्रिप्ट नहीं कर रहा हूँ ... ताकि आप इंजन * इसे संभाल करने के लिए * कोशिश कर के अप्रत्याशित परिणाम प्राप्त:
अंत में यहाँ कैसे पार्सर अभिव्यक्ति का मूल्यांकन करता है। .. मुझे सामान्य स्थिति सामान्य है। –
@ निक, मुझे यह भी संदेह है कि यह वैध जेएस है, और मैं संभावना को स्वीकार करने के लिए तैयार हूं कि यह केवल अपरिभाषित व्यवहार है। हालांकि, तथ्य यह है कि सभी 4 इंजन (जिनमें अलग-अलग कार्यान्वयन होते हैं) इसे समान रूप से दिलचस्प मानते हैं। –
@ मैथ्यू - एड्रियन का जवाब उन 4 ब्राउज़रों में व्यवहार का एक बहुत अच्छा स्पष्टीकरण है, मुझे अभी भी नहीं लगता कि '[ऑब्जेक्ट]' एक वैध एक्सेसर है हालांकि ... तो यह अभी भी प्रत्येक इंजन पर कैसे होगा इस मामले को संभालेगा। हालांकि यह एक बढ़िया मामला है, और मुझे 3.1 spec में कुछ भी नहीं मिला है जो कहता है कि इसे बिल्कुल कैसे संभाला जाना चाहिए। –