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中的数组属性或者索引。
总结
delete
删除属性- 变量
- delete 只对对象自身属性起作用,不能删除原型链上的属性
- 使用 var 声明的属性都是不可配置的, delete 不能删除