वे समान नहीं होते हैं। मुख्य अंतर यह है
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
डिलीट ऑपरेटर पूरी तरह से एक संपत्ति को हटा देता है। एक संपत्ति को अपरिभाषित करने के लिए मूल्य को हटा देता है। संपत्ति को शून्य में सेट करने से मूल्य को शून्य मान में बदल दिया जाता है। यहाँ एक पर्फ़ परीक्षण करता है, तो आप की तरह है: http://jsperf.com/delete-vs-undefined-vs-null/3 – j08691
@ Nit j08691: यह मूल्य नहीं निकालता है। यह 'undefined' मूल्य है, जो अभी भी एक है के रूप में प्रदान करती है .. –
आपको इस बारे में बात करनी चाहिए कि आप इसकी परवाह क्यों करते हैं, तो उत्तर आपकी वास्तविक समस्या को पूरा कर सकता है। –