javascript如何在object中删除属性


本文摘自PHP中文网,作者醉折花枝作酒筹,侵删。

在js中,可以使用delete关键字在object中删除属性,语法格式为“delete object.属性”。delete操作符用于删除对象的某个属性,当delete操作符返回true时表示可以删除,返回false表示不能删除。

本教程操作环境:windows7系统、javascript1.8.5版、Dell G3电脑。

从对象上删除属性的语义正确方法是使用delete关键字。

给定对象

1

2

3

4

const car = {

  color: 'blue',

  brand: 'Ford'

}

您可以使用以下命令从此对象中删除属性

1

delete car.brand

]]7FH4GN`W5Z2EW5_@]I}U5.png

它的工作方式还表示为:

1

2

3

delete car['brand']

delete car.brand

delete newCar['brand']

将属性设置为undefined

如果您需要以非常优化的方式执行此操作,例如在循环中对大量对象进行操作时,另一种选择是将属性设置为undefined 。

由于其性质, delete的性能要比简单地重新分配给undefined 慢很多 ,比慢得多50倍。

但是,请记住,该属性不会从对象中删除。 它的值被擦除了,但是如果您迭代该对象,它仍然存在:

使用delete仍然非常快,只有在您有充分理由这样做时,才应研究此类性能问题,否则始终首选具有更清晰的语义和功能。

删除属性而不更改对象

扩展资料:

delete 操作符用于删除对象的某个属性。

语法:

直接使用delete操作符

1

delete object.property 或 delete object['property']

例如:

1

2

3

4

5

6

7

8

var person = {

    name: 'abc'

    age: 18

}

 

delete person.name

 

console.log(person) // {age: 18}

返回值:

delete操作符具有返回值,返回值为布尔值,对于所有情况都是true,即使是删除不存在的属性也会返回true,还是如上代码,不防打印一下返回值看看

1

2

console.log(delete person.name) //true

console.log(delete person.job) //即使删除对象不存在的属性依然返回true

但是也有例外的情况(返回false),如果属性是不可配置属性(对于不可配置属性的概念,可以参考Object. defineProperty,我第一次听说这个概念的时候也有点蒙圈), 在非严格模式下,返回false,在严格模式下则会抛出语法错误的异常。

具体使用

1. 对象属性不存在

如上所述,如果删除对象不存在的属性,delete无效,但是返回值仍然为true

2. 原型链上存在该同名属性

如果delete操作符删除属性成功,则该属性将永远不存在,但是该对象原型链上存在该同名属性,则该对象会从原型链上继承该同名属性。但和内存并无关联,内存管理并不是delete操作符可以操作的,而且一点关系也没有。内存管理推荐MDN这篇文章

1

2

3

4

5

6

7

8

9

10

11

12

// 构造函数

function Person() {

    this.name = "张三",

    this.job = "工程师"

}

 

Person.prototype.name = "李四"

// 创建实例对象

var p = new Person();

// 只删除p实例的name属性

delete p.name;

console.log(p) => // 通过打印如下图,name属性成功删除

1

2

接下来看:

console.log(p.name) => // '李四' 依然可以访问到

所以可以看出delete操作只会在自身的属性上起作用,这里能console出来'张三',是作用域链的原因,当实例本身无该属性的时候,就会去找它的protype身上有无该同名属性。

3. 使用var声明

使用var声明的属性(包括函数),不能从全局作用域或函数作用域中删除

在全局作用域中声明属性:

1

2

3

4

5

// 声明属性

var a = 1; // 等同于window.a

delete // 严格模式下抛出语法异常 SyntaxError

console.log(a); // 1 非严格模式下

console.log(delete a); // 非严格模式下false

1

2

3

4

5

6

7

8

// 声明函数

var fn = function () {

    console.log(1);

}

delete fn // 严格模式下抛出语法异常  SyntaxError

fn() // 1 非严格模式下delete失效, 函数依然存在

 

// 另外, 除字面量定义外,匿名函数定义函数效果也是一样

在函数作用域中声明属性(效果和在全局作用域中一样):

1

2

3

4

5

6

7

8

9

// 局部作用域声明属性

funtion fn() {

    var a = 1;

    delete a; // 严格模式下抛出语法异常 SyntaxError

    console.log(a); // 1

    console.log(delete a); // 非严格模式下false

}

 

fn();

1

2

3

4

5

6

7

8

9

10

// 局部作用域声明函数

var fn = function() {

    var fn2 = function() {

        console.log(1);

    };

    delete fn2 // 严格模式下抛出语法异常 SyntaxError

    console.log(delete fn2); // false 非严格模式下

    fn2(); // 1

}

fn();

另外, 需要注意的是,在对象中定义的函数是可以删除的,和属性一样,比如

1

2

3

4

5

6

7

8

var person = {

    name: '张三',

    showName: function () {

        console.log(this.name);

    }

}

delete person.showName

console.log(person.showName) // undefined

4. let和const声明的属性

阅读剩余部分

相关阅读 >>

手把手带你了解javascript中变量和词法环境

js怎么替换字符串?

html怎么加入js

js怎么通过类来修改css样式

javascript中的定时器

javascript产生随机数的几个用法小结

简述javascript如何创建数组

了解javascript中object.freeze()与const之间的区别

exports和module.expors之间有什么区别及联系?

javascript介绍前端安全知多少

更多相关阅读请进入《javascript》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...