How to unset a JavaScript variable?

后端 未结 11 2044
执笔经年
执笔经年 2020-11-22 04:16

I have a global variable in JavaScript (actually a window property, but I don\'t think it matters) which was already populated by a previous script but I don\'t

相关标签:
11条回答
  • 2020-11-22 04:45

    @scunlife's answer will work, but technically it ought to be

    delete window.some_var; 
    

    delete is supposed to be a no-op when the target isn't an object property. e.g.,

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

    But since global variables are actually members of the window object, it works.

    When prototype chains are involved, using delete gets more complex because it only removes the property from the target object, and not the prototype. e.g.,

    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.
    

    So be careful.

    EDIT: My answer is somewhat inaccurate (see "Misconceptions" at the end). The link explains all the gory details, but the summary is that there can be big differences between browsers and depending on the object you are deleting from. delete object.someProp should generally be safe as long as object !== window. I still wouldn't use it to delete variables declared with var although you can under the right circumstances.

    0 讨论(0)
  • 2020-11-22 04:46

    ECMAScript 2015 offers Reflect API. It is possible to delete object property with Reflect.deleteProperty():

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

    To delete property of global window object:

    Reflect.deleteProperty(window, 'some_var');
    

    In some cases properties cannot be deleted (when the property is not configurable) and then this function returns false (as well as delete operator). In other cases returns 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
    

    There is a difference between deleteProperty function and delete operator when run in strict mode:

    '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
    
    0 讨论(0)
  • 2020-11-22 04:47
    some_var = null;
    
    //or remove it..
    delete some_var;
    
    0 讨论(0)
  • 2020-11-22 04:47

    In addition to what everyone had written, also note that delete returns boolean. It can tell you if the delete was successful or not.

    Testing on Chrome, everything except let was deletable. when delete returned true it actually removed them:

    implicit_global = 1;
    window.explicit_global = 1;
    function_set = function() {};
    function function_dec() { };
    var declared_variable = 1;
    let let_variable = 1;
    
    delete implicit_global; // true, tested on Chrome 52
    delete window.explicit_global; // true, tested on Chrome 52
    delete function_set; // true, tested on Chrome 52
    delete function_dec; // true, tested on Chrome 52
    delete declared_variable; // true, tested on Chrome 52
    delete let_variable; // false, tested on Chrome 78
    
    0 讨论(0)
  • 2020-11-22 04:49

    You cannot delete a variable if you declared it (with var x;) at the time of first use. However, if your variable x first appeared in the script without a declaration, then you can use the delete operator (delete x;) and your variable will be deleted, very similar to deleting an element of an array or deleting a property of an object.

    0 讨论(0)
  • 2020-11-22 04:54

    TLDR: simple defined variables (without var, let, const) could be deleted with delete. If you use var, let, const - they could not be deleted neither with delete nor with Reflect.deleteProperty.

    Chrome 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"
    

    FF Nightly 53.0a1 shows same behaviour.

    0 讨论(0)
提交回复
热议问题