delete
delete命令用于删除对象的属性,删除成功后返回true。
js
let a = { key: 123 }
console.log(delete a.key) // true
console.log(a) // {}
let a = { key: 123 }
console.log(delete a.key) // true
console.log(a) // {}
delete不能删除原型链上的属性
js
function fun() { }
fun.prototype.age = 18
let a = new fun()
console.log(delete a.age) // true
console.log(a.age) // 18
function fun() { }
fun.prototype.age = 18
let a = new fun()
console.log(delete a.age) // true
console.log(a.age) // 18
删除不存在的键
js
let a = {}
console.log(delete a['id']); // true
console.log(a); // {}
let a = {}
console.log(delete a['id']); // true
console.log(a); // {}
非严格模式下删除不可配置的属性
js
let a = {}
Object.defineProperty(a, 'key', {
value: 666,
configurable: false
})
console.log(a.key); // 666
console.log(delete a.key); // false
console.log(a.key); // 666
let a = {}
Object.defineProperty(a, 'key', {
value: 666,
configurable: false
})
console.log(a.key); // 666
console.log(delete a.key); // false
console.log(a.key); // 666
TIP
- 如果你试图删除的属性不存在,那么delete将不会起任何作用,但仍会返回true
- 对于所有情况都是true,除非属性是一个自己不可配置的属性,在这种情况下,非严格模式返回 false
- delete操作不能删除任何在全局作用域中的函数(无论这个函数是来自于函数声明或函数表达式
- 在对象(object)中的函数是能够用delete操作删除的
- var 声明的属性不能从全局作用域或函数的作用域中删除
- let或const声明的属性不能够从它被声明的作用域中删除
- 不可设置的(Non-configurable)属性不能被移除
示例
- 自身与原型链上的具有同名属性
js
function fn(){
this.name = 'abc'
}
fn.prototype.name = '123'
let a = new fn()
console.log(a.name) // abc
delete a.name
console.log(a.name) // 123
delete fn.prototype.name
console.log(a.name) // undefined
function fn(){
this.name = 'abc'
}
fn.prototype.name = '123'
let a = new fn()
console.log(a.name) // abc
delete a.name
console.log(a.name) // 123
delete fn.prototype.name
console.log(a.name) // undefined