delete的用法

delete 是项目中使用频率并不很高的一个操作,书上写delete操作符要谨慎使用,因为大多数现代js引擎会针对构造函数创建的实例进行性能优化,而delete会破坏这种优化。

例题

看下题最后输出的是什么

function Fn(obj){
    delete obj
    return obj
}
Fn({'name':'小菜'})

delete 操作符用于删除对象的某个属性;如果没有指向这个属性的引用,那它最终会被释放

语法

直接使用delete操作符

delete object.property
delete object['property']

例如:

var person = {
    name: '小菜'
    age: 18
}
delete person.name
console.log(person) // {age: 18}

返回值:对于所有情况都是true,即使是删除不存在的属性也会返回true,还是如上代码,不防打印一下返回值看看
除非属性是一个自身的不可配置的属性,在这种情况下,非严格模式返回 false。

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

具体使用

1. 对象属性不存在

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

2. delete 和原型链

如果delete操作符删除属性成功,则该属性将永远不存在,但是该对象原型链上存在该同名属性,则该对象会从原型链上继承该同名属性。

function Person() {
    this.name = "小菜",
    this.job = "工程师"
}

Person.prototype.name = "菜菜"
// 创建实例对象
var p = new Person();
// 只删除p实例的name属性
delete p.name;
console.log(p) // 通过打印,name属性成功删除,不能删除原型链上的属性
/*
    Person { job: "工程师" }
    job: "工程师"
    __proto__:
        name: "菜菜"
        constructor: ƒ Person()
        __proto__: Object
*/
console.log(p.name) // 菜菜

注意:只对对象自身属性起作用,不能删除原型链上的属性

3.不可设置的属性

Math, Array, Object等内置对象的属性不可删除

console.log(Array.length); // 1
delete Array.length
console.log(Array.from); 0

需要注意的是,只是这些内置对象的属性不可删除,内置对象的方法是可以删除的,比如:

console.log(Array.forEach); // 内置函数
delete Array.forEach // 不用区分严格模式与否
console.log(Array.forEach); // undefined
  • 使用 var 声明的属性都是不可配置的, delete 不能删除
    const str = '小菜'
    console.log(str) // 小菜
    delete str
    console.log(str) // 小菜
  • let和const声明的属性
    任何用let或const声明的属性不能够从它被声明的作用域中删除,我试了下,和var的效果是一样的

3.delete 和数组

使用delete操作符删除数组总某项元素时,被删除的元素会从该数组中删除,但是数组的length并不会改变

var arr = [1, 2, 3];
delete arr[1]
console.log(arr); 
/*
    (3) [1, empty, 3]
    0: 1
    2: 3
    length: 3
*/
console.log(arr[1]); // undefined

根据MDN中in在array中的使用:i in array:i表示array中的数组属性或者索引。

总结

  1. delete删除属性
    • 变量
    • delete 只对对象自身属性起作用,不能删除原型链上的属性
    • 使用 var 声明的属性都是不可配置的, delete 不能删除

   转载规则


《delete的用法》 echo丶若梦 采用 知识共享署名 4.0 国际许可协议 进行许可。
 上一篇
CommonJs和Es Module及它们的区别 CommonJs和Es Module及它们的区别
为什么会有CommonJs和Es Module呢我们都知道在早期JavaScript模块这一概念,都是通过script标签引入js文件代码。当然这写基本简单需求没有什么问题,但当我们的项目越来越庞大时,我们引入的js文件就会越多,这时就会出
2021-03-16
下一篇 
手写一个🍏🍏🍏 手写一个🍏🍏🍏
写一个call🍏模拟一个call方法查看 Function.prototype.myCall = function (context) { // 挂在一个fn函数 var context = context || win
  目录