javascript - हरण - व्हाट इस जावास्क्रिप्ट




जावास्क्रिप्ट चर को कैसे अनसेट करें? (7)

@ स्कूनलाइफ़ का जवाब काम करेगा, लेकिन तकनीकी रूप से यह होना चाहिए

delete window.some_var; 

जब लक्ष्य ऑब्जेक्ट प्रॉपर्टी नहीं होता है तो हटाएं नो-ऑप होना चाहिए। जैसे,

(function() {
   var foo = 123;
   delete foo; // wont do anything, foo is still 123
   var bar = { foo: 123 };
   delete bar.foo; // foo is gone
}());

लेकिन चूंकि वैश्विक चर वास्तव में विंडो ऑब्जेक्ट के सदस्य हैं, यह काम करता है।

जब प्रोटोटाइप चेन शामिल होते हैं, तो डिलीट का उपयोग करना अधिक जटिल हो जाता है क्योंकि यह केवल लक्ष्य वस्तु से संपत्ति को हटा देता है, न कि प्रोटोटाइप। जैसे,

function Foo() {}
Foo.prototype = { bar: 123 };
var foo = new Foo();
// foo.bar is 123
foo.bar = 456;
// foo.bar is now 456
delete foo.bar;
// foo.bar is 123 again.

तो सावधान रहें।

संपादित करें: मेरा जवाब कुछ हद तक गलत है (अंत में "गलत धारणाएं" देखें)। लिंक सभी गॉरी विवरण बताता है, लेकिन सारांश यह है कि ब्राउज़र के बीच बड़े अंतर हो सकते हैं और उस ऑब्जेक्ट के आधार पर जो आप हटा रहे हैं। delete object.someProp को delete object.someProp आमतौर पर object !== window तक सुरक्षित delete object.someProp चाहिए object !== window । मैं अभी भी var साथ घोषित चर को हटाने के लिए इसका उपयोग नहीं करता हूं, हालांकि आप सही परिस्थितियों में कर सकते हैं।

मेरे पास जावास्क्रिप्ट में एक वैश्विक चर है (वास्तव में एक window संपत्ति है, लेकिन मुझे नहीं लगता कि यह महत्वपूर्ण है) जो पहले से ही पिछली लिपि द्वारा पॉप्युलेट किया गया था, लेकिन मुझे एक और स्क्रिप्ट नहीं चाहिए जो बाद में अपना मूल्य देखने के लिए चलेगी या यह था यहां तक ​​कि परिभाषित भी।

मैंने some_var = undefined और यह typeof some_var == "undefined" के उद्देश्य के लिए काम करता है लेकिन मुझे नहीं लगता कि यह इसके बारे में जाने का सही तरीका है।

तुम क्या सोचते हो?


ईसीएमएस्क्रिप्ट 2015 प्रतिबिंब एपीआई प्रदान करता है। Reflect.deleteProperty() साथ ऑब्जेक्ट प्रॉपर्टी को हटाना संभव है:

Reflect.deleteProperty(myObject, 'myProp');
// it is equivalent to:
delete myObject.myProp;
delete myObject['myProp'];

वैश्विक window ऑब्जेक्ट की संपत्ति को हटाने के लिए:

Reflect.deleteProperty(window, 'some_var');

कुछ मामलों में गुणों को हटाया नहीं जा सकता है (जब संपत्ति कॉन्फ़िगर करने योग्य नहीं होती है) और फिर यह फ़ंक्शन false (साथ ही ऑपरेटर को हटा देता है ) देता है। अन्य मामलों में true आता true :

Object.defineProperty(window, 'some_var', {
    configurable: false,
    writable: true,
    enumerable: true,
    value: 'some_val'
});

var frozen = Object.freeze({ myProperty: 'myValue' });
var regular = { myProperty: 'myValue' };
var blank = {};

console.log(Reflect.deleteProperty(window, 'some_var')); // false
console.log(window.some_var); // some_var

console.log(Reflect.deleteProperty(frozen, 'myProperty')); // false
console.log(frozen.myProperty); // myValue

console.log(Reflect.deleteProperty(regular, 'myProperty')); // true
console.log(regular.myProperty); // undefined

console.log(Reflect.deleteProperty(blank, 'notExistingProperty')); // true
console.log(blank.notExistingProperty); // undefined

सख्त मोड में चलाते समय deleteProperty फ़ंक्शन और ऑपरेटर को delete बीच एक अंतर है:

'use strict'

var frozen = Object.freeze({ myProperty: 'myValue' });

Reflect.deleteProperty(frozen, 'myProperty'); // false
delete frozen.myProperty;
// TypeError: property "myProperty" is non-configurable and can't be deleted

टीएलडीआर: सरल परिभाषित चर (बिना var , let , const ) को हटाकर हटाया जा सकता है। यदि आप var , let , const उपयोग let - तो उन्हें हटाया नहीं जा सकता है न तो delete और न ही Reflect.deleteProperty साथ।

क्रोम 55:

simpleVar = "1";
"1"
delete simpleVar;
true
simpleVar;
VM439:1 Uncaught ReferenceError: simpleVar is not defined
    at <anonymous>:1:1
(anonymous) @ VM439:1
var varVar = "1";
undefined
delete varVar;
false
varVar;
"1"
let letVar = "1";
undefined
delete letVar;
true
letVar;
"1"
const constVar="1";
undefined
delete constVar;
true
constVar;
"1"
Reflect.deleteProperty (window, "constVar");
true
constVar;
"1"
Reflect.deleteProperty (window, "varVar");
false
varVar;
"1"
Reflect.deleteProperty (window, "letVar");
true
letVar;
"1"

एफएफ नाइटली 53.0 ए 1 एक ही व्यवहार दिखाता है।


डिलीट ऑपरेटर किसी ऑब्जेक्ट से किसी संपत्ति को हटा देता है।

delete object.property
delete object['property']

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/delete

प्रश्न के अनुसार आपको अनुवर्ती अनुशंसाओं की आवश्यकता है

delete some_var;
delete window.some_var;
delete window['some_var'];

यदि आप बिना किसी चर के चर को घोषित कर रहे हैं, तो उचित तरीके से delete foo का उपयोग करना होगा।

हालांकि, इसे हटाने के बाद, यदि आप इसे किसी ऑपरेशन में उपयोग करने का प्रयास करते हैं जैसे कि ReferenceError एरर फेंक दिया जाएगा क्योंकि आप एक अविकसित, अपरिभाषित पहचानकर्ता को स्ट्रिंग नहीं जोड़ सकते हैं। उदाहरण:

x = 5;
delete x
alert('foo' + x )
// ReferenceError: x is not defined

कुछ परिस्थितियों में यह गलत, शून्य, या अपरिभाषित करने के लिए सुरक्षित हो सकता है, इसलिए यह घोषित किया गया है और इस प्रकार की त्रुटि नहीं फेंक देगा।

foo = false

ध्यान दें कि ECMAScript null , false , undefined , 0 , NaN , या '' सभी false मूल्यांकन करेंगे। बस सुनिश्चित करें कि आप !== ऑपरेटर का उपयोग नहीं करते हैं, बल्कि इसके बजाय != जब बूलियन के लिए जांच टाइप करें और आप पहचान जांच नहीं चाहते हैं (तो null == false और false == undefined )।

यह भी ध्यान रखें कि delete संदर्भों को "हटाएं" नहीं बल्कि केवल वस्तु पर गुण हैं, उदाहरण के लिए:

bah = {}, foo = {}; bah.ref = foo;

delete bah.ref;
alert( [bah.ref, foo ] )
// ,[object Object] (it deleted the property but not the reference to the other object)

यदि आपने var साथ एक चर घोषित किया है तो आप इसे हटा नहीं सकते:

(function() {
    var x = 5;
    alert(delete x)
    // false
})();

राइनो में:

js> var x
js> delete x
false

न ही आप कुछ पूर्वनिर्धारित गुणों को हटा सकते हैं जैसे Math.PI :

js> delete Math.PI
false

किसी भी भाषा के साथ delete लिए कुछ अजीब अपवाद हैं, यदि आप पर्याप्त देखभाल करते हैं तो आपको पढ़ना चाहिए:


यदि आपने पहले उपयोग के समय इसे (var x; के साथ) घोषित किया है तो आप एक चर को हटा नहीं सकते हैं। हालांकि, यदि आपका वैरिएबल एक्स पहली बार स्क्रिप्ट में घोषणा के बिना दिखाई देता है, तो आप डिलीट ऑपरेटर (एक्स हटाएं;) का उपयोग कर सकते हैं और आपका वैरिएबल हटा दिया जाएगा, एक सरणी के तत्व को हटाने या किसी ऑब्जेक्ट की संपत्ति को हटाने के समान ही ।


some_var = null;

//or remove it..
delete some_var;







undefined