2013-07-30 3 views
11

पर विचार करें निम्नलिखित के साथ आपत्ति उठाने का ...'अनिर्धारित' कुंजी के रूप में काम करता है चर 'अनिर्धारित' संपत्ति नाम

var x = {}; 
x.undefined = "Hello World!"; 
var y; 

//Prints "Hello World!" 
console.log(x[y]); 

Working jsFiddle

इस क्यों होता है? क्या यह this की वजह से है, जहां यह वास्तविक अपरिभाषित की बजाय स्ट्रिंग लौटा रहा है?

+0

एक ही चाल x.true = "हैलो वर्ल्ड" के साथ काम करती है .. x.true और x ['true'] एक ही मान को संदर्भित करती हैं। – Mishax

उत्तर

16

जब आप x.undefined करते हैं तो आप x की संपत्ति सेट कर रहे हैं जिसे 'undefined' कहा जाता है। तथ्य यह है कि यह undefined ( आरक्षित शब्द परिवर्तनीय writable:false के साथ एक नाम साझा करता है) संयोग है।

बाद में जब आप करते हैं, console.log(x[y]), आप x में देख रहे हैं। वस्तुओं की कुंजी तार हैं, इसलिए y को एक स्ट्रिंग में परिवर्तित कर दिया गया है। जब undefined को एक स्ट्रिंग में परिवर्तित किया जाता है, तो यह 'undefined' बन जाता है। यही कारण है कि 'Hello World!' वापस आ गया है।

+0

तो इसे 'x' की कुंजी के रूप में पास करते समय, जावास्क्रिप्ट स्वचालित रूप से 'y' के मान को पार्स कर रहा है जो एक स्ट्रिंग अक्षर" अपरिभाषित "के लिए' अपरिभाषित 'है? –

+1

@ जेक मॉरिसन: हाँ, बिल्कुल। यह 'y' को एक स्ट्रिंग में परिवर्तित कर रहा है :-) –

+0

'अपरिभाषित' किसी भी तरह से आरक्षित शब्द नहीं है। यह एक सामान्य वैश्विक परिवर्तनीय है, जिसमें 'लिखने योग्य: झूठा'] है (http://www.ecma-international.org/ecma-262/5.1/#sec-15.1.1.3) – Esailija

0

आप एक्स के लिए "अनिर्धारित" संपत्ति को परिभाषित है, लेकिन आप वैश्विक वस्तु की "अनिर्धारित" संपत्ति

2

जब गुण . अंकन का उपयोग एक्सेस किया जाता है, संपत्ति का नाम एक अभिव्यक्ति के रूप में मूल्यांकन नहीं किया गया है ओवरराइड नहीं करते, यह एक शाब्दिक स्ट्रिंग है।

x.undefined 

बराबर है करने के लिए:

x['undefined'] 

एक संपत्ति जिसका कुंजी undefined है सेट करने के लिए, आपके द्वारा लिखी करना होगा:

x[undefined] = "Bye, cruel world"; 

दिलचस्प है, क्रोम मुझे ऐसा करने की सुविधा देता है।

+3

उस अंतिम मामले में, कुंजी ' अपरिभाषित 'को' अपरिभाषित '' के लिए मजबूर किया गया है, क्योंकि [ईसीएमएस्क्रिप्ट संपत्ति का उपयोग] (http://www.ecma-international.org/ecma-262/5.1/#sec-11.2.1) (चरण 6 देखें) को जोड़ता है ['ToString'] के साथ एक स्ट्रिंग की कुंजी (http://www.ecma-international.org/ecma-262/5.1/#sec-9.8), और' ToString (अपरिभाषित) => "अपरिभाषित" '। – apsillers

+0

हाँ, मैंने यह पाया कि 'टाइपोफ' कुंजी को कॉल करके। – Barmar

+0

@apsillers उत्सुक, क्या यह सिर्फ क्रोम है जो अनिर्धारित या सभी आधुनिक ब्राउज़रों को उस spec – Melbourne2991

संबंधित मुद्दे