वे समकक्ष नहीं हैं। मुख्य अंतर यह है कि सेटिंग
a.x = undefined
इसका मतलब है कि a.hasOwnProperty("x")अभी भी सच लौटेगा, और इसलिए, यह अभी भी एक for inपाश में, और में दिखाई देगाObject.keys()
delete a.x
इसका मतलब है कि a.hasOwnProperty("x")झूठे वापस आ जाएंगे
जिस तरह से वे समान हैं कि आप यह नहीं बता सकते हैं कि कोई संपत्ति परीक्षण द्वारा मौजूद है
if (a.x === undefined)
यदि आपको ऐसा नहीं करना चाहिए यदि आप यह निर्धारित करने की कोशिश कर रहे हैं कि क्या कोई संपत्ति मौजूद है, तो आपको हमेशा उपयोग करना चाहिए
// If you want inherited properties
if ('x' in a)
// If you don't want inherited properties
if (a.hasOwnProperty('x'))
प्रोटोटाइप श्रृंखला के बाद ( zzzzBov द्वारा उल्लिखित ) कॉलिंग deleteइसे प्रोटोटाइप श्रृंखला को ऊपर ले जाने की अनुमति देगा, जबकि अपरिभाषित मान सेट करने पर जंजीर प्रोटोटाइप में संपत्ति की तलाश नहीं होगी http://jsfiddle.net/NEEw4/1/
var obj = {x: "fromPrototype"};
var extended = Object.create(obj);
extended.x = "overriding";
console.log(extended.x); // overriding
extended.x = undefined;
console.log(extended.x); // undefined
delete extended.x;
console.log(extended.x); // fromPrototype
हटाए गए गुण हटाना यदि आप जिस संपत्ति को हटाने की कोशिश कर रहे हैं वह विरासत में मिली है, deleteतो इसका कोई असर नहीं पड़ेगा। यही है, deleteकेवल ऑब्जेक्ट से गुण हटाता है, विरासत में मिला गुण नहीं।
var obj = {x: "fromPrototype"};
var extended = Object.create(obj);
delete extended.x;
console.log(extended.x); // Still fromPrototype
इसलिए, यदि आपको यह सुनिश्चित करने की आवश्यकता है कि किसी वस्तु का मूल्य अपरिभाषित deleteहोगा , तो संपत्ति के वारिस होने पर काम नहीं करेगा, आपको इसे undefinedउस स्थिति में सेट (ओवरराइड) करना होगा । जब तक कि इसके लिए जाँच की जाने वाली जगह का उपयोग hasOwnPropertyनहीं किया जाएगा, लेकिन यह संभावना नहीं है कि हर जगह यह जांचना सुरक्षित होगा कि यह उपयोग करेगाhasOwnProperty