HOME
NAVIGATION

delete操作符


0.delete操作符用法和规则

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

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

返回值就算是删除不存在的属性,delete因此没有生效也会返回true,但是也有例外的情况(返回false),如果属性是不可配置属性,在非严格模式下返回false,严格模式下语法错误

原型链上存在相同属性

// 构造函数
function Person() {
this.name = "张三",
this.job = "工程师"
}
Person.prototype.name = "李四"
// 创建实例对象
var p = new Person();
// 只删除p实例的name属性
delete p.name;
console.log(p) => // Person {job:'工程师'}
console.log(p.name) => // '张三' 依然可以访问到

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

无论使用var声明函数或者属性,都无法使用delete,严格模式下语法错误,非严格模式下返回false

但是,在对象中定义的函数、属性是可以删除的

var person = {
name: '张三',
showName: function () {
console.log(this.name);
}
}
delete person.showName
console.log(person.showName) // undefined

使用let、const声明的属性不能够从它被声明的作用域中删除

Math, Array, Object等内置对象的属性不可删除,但是方法可以删除

delete Array.prototype //严格模式下抛出异常
console.log(Array.prototype) // 非严格模式下,prototype依然存在
console.log(Array.prototype.join); // 非严格模式下,join方法依然存在
console.log(Array.forEach); // 内置函数
delete Array.forEach // 不用区分严格模式与否
console.log(Array.forEach); // undefined

Object.defineProperty()设置为不可设置的属性,不可删除

var person = {};
Object.defineProperty(person, 'name', {
value: '张三',
configurable: false
})
delete person.name // 严格模式下,抛出异常
console.log(person.name); // 张三
console.log(delete person.name); // 非严格模式false

删除数组

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

var arr = [1, 2, 3];
delete arr[1]
console.log(arr); // [1, undefined, 2]
console.log(delete arr[1]) // true
console.log(arr[1]); // undefined

但是这里存在一个问题

console.log(1 in arr) // false

所以如果想把数组中某一项赋值成undefined时,不应该使用delete操作符,而是直接使用下边赋值

arr[1] = undefined;
// 这样就可以解决上面的问题
console.log(1 in arr) // true