• javascript 中的 delete


    那么,为什么我们能删除一个对象的属性:

    var x = { a: 1 };
    delete x.a; // true
    x.a; // undefined

    但却不能删除一个变量:

    var x = 1;
    delete x; // false;
    x; // 1

    也不能删除一个函数:

    function x() {};
    delete x; // false;
    typeof x; // "function"
    • 注意:delete 只有当一个属性无法被删除时才返回 false。
    •  每一个属性拥有零至多个如内部属性——*ReadOnly,DontEnum,DontDelete和Internal**。 你可以把它们想象为标签——一个属性可能拥有也可能没有某个特殊的内部属性。 在今天的讨论中,我们所感兴趣的是 DontDelete。
    • 当声明变量和函数时,它们成为了变量对象(Variable object)——要么是活化对象(在函数代码中), 要么是全局对象(在全局代码中)——的属性,这些属性伴随生成了内部属性 DontDelete。 然而,任何显式/隐式赋值的属性不生成 DontDelete。 而这就是本质上为什么我们能删除一些属性而不能删除其他的原因。
    var GLOBAL_OBJECT = this;
    
    /* 'foo'是全局对象的一个属性,
        它通过变量声明而生成,因此拥有内部属性DontDelete
        这就是为什么它不能被删除*/
    var foo = 1;
    delete foo; // false
    typeof foo; // "number"
    
    /* 'bar'是全局对象的一个属性,
        它通过变量声明而生成,因此拥有DontDelete子
        这就是为什么它同样不能被删除*/
    function bar() {};
    delete bar; // false
    typeof bar; // "function"
    
    /* 'baz'也是全局对象的一个属性,
        然而,它通过属性赋值而生成,因此没有DontDelete
        这就是为什么它可以被删除*/
    GLOBAL_OBJECT.baz = "baz";
    delete GLOBAL_OBJECT.baz; // true
    typeof GLOBAL_OBJECT.baz; // "undefined"
    

    1.5、内建和DontDelete | Build-ins and DontDelete

    所以这就是所有这一切发生的原因:属性的一个特殊的内部属性控制着该属性是否可以被删除。 注意:内建对象的一些属性拥有内部属性 DontDelete,因此不能被删除; 特殊的 arguments 变量(如我们所知的,活化对象的属性)拥有 DontDelete; 任何函数实例的 length (返回形参长度)属性也拥有 DontDelete:

    复制代码
    (function() {
        //不能删除'arguments',因为有DontDelete
        delete arguments; // false;
        typeof arguments; // "object"
    
        //也不能删除函数的length,因为有DontDelete
        function f() {};
        delete f.length; // false;
        typeof f.length; // "number"
    }) ();
    复制代码

    与函数 arguments 相关联的属性也拥有 DontDelete,同样不能被删除

    复制代码
    (function(foo,bar) {
        delete foo; // false
        foo; // 1
    
        delete bar; // false
        bar; // "bah"
    }) (1,"bah");
    复制代码

    1.6、未声明的变量赋值 | Undeclared assignments

    • 你可能记得,未声明的变量赋值会成为全局对象的属性,除非这一属性在作用域链内的其他地方被找到。 而现在我们了解了属性赋值和变量声明的区别——后者生成 DontDelete 而前者不生成——这也就是为什么未声明的变量赋值可以被删除的原因了。
    var GLOBAL_OBJECT = this;
    
    /* 通过变量声明生成全局对象的属性,拥有DontDelete */
    var foo = 1;
    
    /* 通过未声明的变量赋值生成全局对象的属性,没有DontDelete */
    bar = 2;
    
    delete foo; // false
    delete bar; // true
    

    注意:内部属性是在属性生成时确定的,之后的赋值过程不会改变已有的属性的内部属性。 理解这一区别是重要的。

    /* 'foo'创建的同时生成DontDelete */
    function foo() {};
    
    /* 之后的赋值过程不改变已有属性的内部属性,DontDelete仍然存在 */
    foo = 1;
    delete foo; // false;
    typeof foo; // "number"
    
    /* 但赋值一个不存在的属性时,创建了一个没有内部属性的属性,因此没有DontDelete */
    this.bar = 1;
    delete bar; // true;
    typeof bar; // "undefined"


    总结:
    • 变量和函数声明都是活化(Activation)全局(Global)对象的属性。
    • 属性拥有内部属性,其中一个—— DontDelete 负责确定一个属性是否能够被删除。
    • 全局代码或函数代码中的变量、函数声明都生成拥有 DontDelete 的属性。
    • 函数参数同样是活化对象的属性,也拥有 DontDelete。
    • 删除对象中的属性:delete 对象.成员

                只能删除自有的成员

                只有var声明的全局变量不让delete

                使用window.window[""]增加的全局成员可以delete

  • 相关阅读:
    原生js设置cookie
    vuex数据持久化存储
    export和export default的区别
    userAgent判断是微信还是企业微信
    SVN的使用方法
    Js字符串反转
    通用JS10——一元加和减
    通用JS十——递增/递减操作符
    通用JS9
    @SuppressWarning注解用法
  • 原文地址:https://www.cnblogs.com/12606huchao/p/4966396.html
Copyright © 2020-2023  润新知