2015-03-26 7 views
11

मुझे समझ में नहीं आता कि उत्पादन 456 क्यों है। मुझे लगता है कि बी [बी] में एक वस्तु की संपत्ति है, और सी एक और संपत्ति है। वे var b और c से बिल्कुल संबंधित नहीं हैं। लेकिन क्यों ए। एबी ओवरराइड?क्यों एक [सी] एक [बी] ओवरराइड?

var a={}, 
    b={key:'b'}, 
    c={key:'c'}; 

a[b]=123; 
a[c]=456; 

console.log(a[b] === 456); //true 
+4

यहां, 'बी' और' सी' 'ए' के गुण हैं, इसलिए वे तार हैं। और किसी ऑब्जेक्ट का स्ट्रिंग प्रस्तुति क्या है? "[ऑब्जेक्ट ऑब्जेक्ट]" – blex

+0

यह कई पहले पूछे जाने वाले प्रश्नों का डुप्लिकेट है – meagar

उत्तर

22

है ऐसा इसलिए है क्योंकि संपत्ति के नाम तार कर रहे हैं, लेकिन अपने b और c वस्तुओं रहे हैं। इसलिए, वे स्ट्रिंग किए गए हैं:

b + ''; // "[object Object]" 
c + ''; // "[object Object]" 
b + '' === c + ''; // true 

चूंकि वे एक ही स्ट्रिंग बन जाते हैं, प्रारंभिक मान ओवरराइड हो जाता है।

इसके बजाय, आप ECMAScript 6 Maps का उपयोग कर, जो आप कुंजी के रूप में किसी भी मूल्य का उपयोग करने की अनुमति पर विचार हो सकता है:

var a = new Map(), 
    b = {key: 'b'}, 
    c = {key: 'c'}; 
a.set(b, 123); 
a.set(c, 456); 
a.get(b); // 123 
5

आपका कुंजी तार करने के लिए परिवर्तित किया जा रहा है। स्ट्रिंग प्रस्तुति "[object Object]" है।

a["[object Object]"] = 123; 
a["[object Object]"] = 456; 

सबूत::

var a={}, 
 
    b={key:'b'}, 
 
    c={key:'c'}; 
 

 
a[b]=123; 
 
a[c]=456; 
 

 
console.log(Object.keys(a));

+0

अगर आपको कोई फर्क नहीं पड़ता है तो जिज्ञासा से बाहर: यदि आप इसके बजाय a.b = 123, a.c = 456 का उपयोग करते हैं तो यह "काम कर रहा है" लगता है। क्या यह केवल इसलिए है क्योंकि [] का उपयोग संपत्ति को पुनर्प्राप्त करने के लिए इसे स्ट्रिंग में बदल देता है, या क्या मैं उलझन में हूं? – Mackan

+1

@ मैकन नो, क्योंकि तब आप सचमुच 'बी' और' सी' का उपयोग संपत्ति के नाम के रूप में कर रहे हैं। आप 'a.b' का उपयोग कर रहे हैं जो' a ['b'] 'जैसा है, जो '{a: {b: 123}}' जैसा ही है। जब आप 'a.b' लिखते हैं, तो संपत्ति का नाम 'बी' * वैरिएबल के रूप में मूल्यांकन नहीं किया जाता है। इसका आपके 'बी' चर के साथ कुछ लेना देना नहीं है। यदि आपने 'a.name' लिखा है, तो इससे कोई फर्क नहीं पड़ता कि दायरे में 'नाम' चर था, फिर भी आप ऑब्जेक्ट" ए "पर" नाम "संपत्ति के साथ काम कर रहे हैं। – meagar

+0

ठीक है, इसलिए 'ए [बी]' का उपयोग कुछ अर्थों में 'बी' का मूल्यांकन करने की कोशिश करता है, लेकिन चूंकि यह एक वस्तु है, यह नहीं कर सकता है और इसके बजाय यह stingyfied है। तो 'एक [बी.की]' वास्तव में 'एक [' बी '] == a.b' होगा। अवधि और [] का उपयोग करने के बीच अंतर में थोड़ा सा पकड़ा गया। (संपादित करें: मुझे लगता है कि मैंने अपनी प्रतिक्रिया लिखते समय संपादित किया था। धन्यवाद, समझ गया!) – Mackan

0

Orial उस के बारे में सही है आप सभी दोनों ही मामलों में कर रहे हैं यह है। जेएस सबसे अधिक परेशानी है डेटा के प्रकार का चर घोषणापत्र में स्पष्ट नहीं है, हालांकि कभी-कभी सुविधाजनक होता है।

इस मामले में, आप एक [ए] == 456 भी कोशिश करते हैं, यह सच दिखाता है।

ए को पहली बार एक आयामी सरणी के रूप में प्रारंभ किया जाता है, जब आप इसे मानचित्र या कुंजी-मान के रूप में उपयोग करने का प्रयास करते हैं, तो आप इस तरह की त्रुटि की अपेक्षा कर सकते हैं।

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