2012-10-11 7 views
8

के लिए इस कोड पर विचार करें:JSON अक्षर और जावास्क्रिप्ट ऑब्जेक्ट्स। मैं उलझन में हूँ

(function(){ 
    var a = {"id": "1", "name": "mike", "lastname": "ross"}; 
    var b = JSON.parse('{"id": "1", "name": "mike", "lastname": "ross"}'); 
    var c = Object.create({"id": "1", "name": "mike", "lastname": "ross"}); 

    document.write(typeof(a) + "</br>"); 
    document.write(typeof(b) + "</br>"); 
    document.write(typeof(c) + "</br>"); 
})();​ 

प्रश्न

  1. कौन से तीन कार्य के बीच मतभेद रहे हैं?
  2. ऑब्जेक्ट्स ए, बी और सी बिल्कुल ओवरलैप करें?
  3. यदि हां, क्यों? यदि नहीं, क्यों?

कृपया अपने उत्तरों के संदर्भ जोड़ें।

Demo

+0

एक, बी और सी में एक ही कुंजी मान जोड़ी के साथ अलग वस्तु है। एक == बी झूठा होगा। वे स्मृति में विभिन्न स्थानों पर हैं। – Anoop

उत्तर

7

a और b प्रभावी रूप से समान हैं (वे एक ही मूल्यों के साथ एक ही गुण होते हैं, समान स्थानों में,): यह एक संभव सुविधा प्रदान करता है। c पूरी तरह से अलग है। आप एक स्पष्ट अंतर देख सकते हैं आपके लिए पृष्ठ के लिए सीमित जानकारी मुद्रण के कंसोल के लिए वस्तुओं के लिए लॉग इन:

enter image description here

c सही पर एक है। यह किसी ऑब्जेक्ट को अपनी संपत्ति के साथ बनाया गया है। आपके द्वारा निर्दिष्ट गुण वास्तव में c पर हैं। इसका कारण यह है कि Object.create पर पहला तर्क बनाया गया ऑब्जेक्ट का prototype है।

ध्यान दें कि आप सका उपयोग Object.create ही प्रभाव प्राप्त करने के लिए - बस पहले तर्क के रूप में Object.prototype पारित:

var d = Object.create(Object.prototype, { 
    "id": { "value": 1 }, //values are 'property descriptors' 
    "name": { "value": "mike" } 
    //etc... 
}); 
7

a और "indentical" वस्तुओं (उसी तरह से है कि {a:1} अब्द {a:1} समान हैं) में b परिणाम।

JSON.parse इनपुट JSON स्ट्रिंग इनपुट करता है, और पार्स किए गए मान को आउटपुट करता है। इस मामले में, एक वस्तु।

c अलग है। Object.create पहले तर्क पर प्रोटोटाइप सेट के साथ एक नई वस्तु बनाता है। आप सत्यापित कर सकते हैं कि c.__proto__.id1 (और पहले दो मामलों में अनुपलब्ध) के बराबर है।

पहली नजर में, सभी तीन विधियों के परिणामस्वरूप "समान" ऑब्जेक्ट होता है: संपत्ति को पढ़ना id सभी मामलों में 1 देता है। तीसरे मामले में, यह परिणाम प्रोटोटाइप विरासत के कारण होता है।

var x = Object.create({id:1}); 
x.id = NaN; 
console.log(x.id); 
// NaN 
delete x.id; 
console.log(x.id); 
// 1 - The old value is back :) 
// (for x = {id: 1};, the old value would be gone!) 
संबंधित मुद्दे