对象属性能否被delete删除取决于其configurable特性:为false时不可删除,true时可删除;class方法、Object.freeze()、var/function声明及Object.prototype原生方法等均隐式产生不可配置属性。

对象属性是否能被 delete 删除,核心取决于它的 configurable 特性,而不是它是否存在、是否可写或是否在原型链上。
configurable 为 false 时 delete 必然失败
当一个属性的 configurable: false,它就进入了“锁定状态”:既不能被删除,也不能修改其 writable 或 enumerable 等特性。
- 普通赋值创建的属性默认
configurable: true,可删 - 用
Object.defineProperty显式设置configurable: false后,该属性就不可删 - 严格模式下对不可配置属性执行
delete会抛出TypeError;非严格模式下只返回false
哪些常见情况会隐式产生不可配置属性
并非只有手动定义才会触发不可配置,很多内置或语法糖行为也会如此:
-
class中定义的方法和访问器(getter/setter)默认不可配置 -
Object.freeze()冻结对象后,所有自有属性自动变为configurable: false - 全局作用域中用
var、function声明的变量/函数,在全局对象(如window或globalThis)上对应属性不可配置 -
Object.prototype上的原生方法(如toString、hasOwnProperty)均不可配置
如何检查一个属性是否可配置
使用 Object.getOwnPropertyDescriptor 查看属性描述符:
const obj = { a: 1 };
Object.defineProperty(obj, 'b', { value: 2, configurable: false });
console.log(Object.getOwnPropertyDescriptor(obj, 'a'));
// { value: 1, writable: true, enumerable: true, configurable: true }
console.log(Object.getOwnPropertyDescriptor(obj, 'b'));
// { value: 2, writable: false, enumerable: false, configurable: false }
只要 configurable 字段是 false,delete 就无法移除它。
绕过删除限制?没有真正绕过,只有替代思路
不能删 ≠ 不能“看起来像删了”。根据场景可选不同策略:
- 想保留原对象结构但隐藏值 → 赋值为
undefined(注意:属性仍存在,in和Object.keys都能检测到) - 需要纯新对象且不改原对象 → 用解构、
Object.fromEntries或Reflect.ownKeys过滤后重建 - 需批量操作或函数式风格 →
Reflect.deleteProperty(obj, key)行为与delete一致,但返回值更明确,适合封装逻辑

















