WithCoderWithCoderWithCoder

Javascript对象属性的删除操作

    在前面的文章中,我们介绍了如何查询和设置Javascript对象的属性,本文介绍如何删除对象的属性。

    在js中,我们可以使用 delete 运算符删除对象的属性。delete 运算符的操作数应该是一个属性访问表达式。需要注意的是,delete只是断开属性和宿主对象的联系,而不会去操作属性中包含的属性。   

    <script>
        // 创建一个直接量对象
        var person = {
            name: 'neil',
            age: 100
        };

        // 删除person的name属性
        delete person.name;
        console.log(person.name); // 返回 undefined
    </script>

    如上面的代码,在使用delete删除person对象的属性name后,再打印输出name属性的值是undefined。

    不过需要注意,delete 运算符只能删除对象的自有属性,不能删除继承的属性(要删除继承的属性,必须从定义这个属性的原型对象上删除它。不过根据之前文章介绍的原型概念,可以知道这样操作会影响到所有继承这个原型的对象)。

    当 delete 表达式删除成功或没有任何副作用(如,删除不存在的属性)时,操作会返回 true。同样,如果 delete 后不是一个有意义的属性访问表达式,delete 操作同样返回true,示例代码如下:   

    <script>
        // 创建一个直接量对象
        var person = {
            name: 'neil',
            age: 100
        };

        // 删除person的name属性
        console.log(delete person.name); // 返回 true

        console.log(delete person.sex); // 没有sex属性,删除没有副作用,返回true

        console.log(delete 1); // 无意义操作,返回true
    </script>

    delete 不能删除那些可配置性为false的属性(尽管可以删除不可扩展对象的可配置属性)。某些内置对象的属性是不可配置的,比如通过变量声明和函数声明创建的全局对象的属性。在严格模式下,删除一个不可配置属性会报一个类型错误。在非严格模式下(以及ECMAScript 3中),delete操作会返回false,示例代码如下:   

    <script>
        // 删除不可配置属性
        console.log(delete Object.prototype); // 返回 false

        var x = 1;
        console.log(delete x); // 删除声明的全局变量,失败,返回false

        function f() {}
        console.log(delete f); // 删除声明的全局函数,失败,返回false
    </script>

    当在非严格模式下删除全局对象的可配置属性时,可以省略对全局对象的引用,直接在 delete 操作符后跟随要删除的属性名即可:   

    <script>
        this.x = 1// 创建全局对象属性(注意没有使用var)
        console.log(delete x); // 删除全局对象的可配置属性,返回true
    </script>

    不过在严格模式下,delete后跟随一个非法的操作数(如上面例子中的x),则会报语法错误。因此,最好的处理方法是不管任何情况下,都显式的指定要删除的对象及其属性。

欢迎分享交流,转载请注明出处:WithCoder » Javascript对象属性的删除操作