delete运算符仅能删除对象自有且可配置的属性,无法删除变量、函数、let/const绑定及原型链继承属性;对不可配置属性返回false(严格模式报错),不释放内存,也不影响原型链访问。

delete 运算符用于删除对象的自有属性(own property),但它**不能删除变量、函数、let/const 声明的绑定,也不能删除原型链上的继承属性**。
只能删除对象的自有可配置属性
delete 只对对象自身拥有的、且 configurable: true 的属性生效。如果属性是不可配置的(比如通过 Object.defineProperty 设置了 configurable: false),delete 会返回 false(严格模式下还会报错)。
- 普通对象字面量创建的属性默认是可配置的,可以被 delete
- 类中定义的实例属性(如
this.x = 1)也是可配置的 - 使用
Object.defineProperty(obj, 'x', { configurable: false })定义的属性无法被 delete
语法和返回值要注意
delete 是一元运算符,写法是 delete obj.prop 或 delete obj['prop']。它总是返回布尔值:
- 删除成功(属性存在且可配置)→ 返回
true - 属性不存在、或不可配置、或不是对象属性(比如全局变量)→ 返回
true(非严格模式)或抛错(严格模式) - 试图 delete 变量(如
let x = 1; delete x;)无效,返回false
常见误区:它不释放内存,也不影响原型链
delete 只是断开对象与其属性的连接,不会触发垃圾回收(GC),也不会影响原型上同名属性的访问:
立即学习“Java免费学习笔记(深入)”;
- 删除后,若原型上有同名属性,访问时会沿原型链找到它
- 数组元素用 delete 删除后,该索引变成 empty slot(不是 undefined),length 不变
- 不要用 delete 清空数组,应改用
length = 0或splice()
替代方案更安全常用
多数场景下,推荐用更明确的方式代替 delete:
- 设为
undefined或null:语义清晰,避免意外原型访问 - 用解构赋值剔除属性:
const { unwanted, ...rest } = obj - 用
Reflect.deleteProperty(obj, 'key'):返回布尔值,行为与 delete 一致但更函数式


















