delete仅对自有且可配置属性有效,删数组元素应避免用delete而用splice或filter,置undefined与delete语义不同,不可变场景需用解构或fromentries返回新对象。

JavaScript 中 delete 运算符能真正移除对象的自有可配置属性,但“安全删除”不只看能不能删,更要看是否删得干净、是否影响后续逻辑、是否符合预期语义。关键不是避免报错,而是避开隐性陷阱。
确认目标是对象自有可配置属性
delete 只对满足两个条件的属性有效:① 属于对象自身(非原型链继承);② [[Configurable]] 特性为 true。大多数用 obj.key = value 或字面量创建的属性默认可配置;但用 Object.defineProperty 显式定义且未设 configurable: true 的属性,delete 会静默失败(非严格模式)或抛错(严格模式)。
- 检查是否自有属性:
obj.hasOwnProperty('key') - 检查是否可配置(需 Reflect):
Reflect.getOwnPropertyDescriptor(obj, 'key')?.configurable === true - 不建议靠
delete返回值判断成功与否——它对不存在的属性也返回true
别误用于数组元素删除
对数组索引使用 delete arr[i] 不会改变 length,也不会移动后续元素,只会留下“空槽”(empty slot)。这种稀疏数组会影响 for...of、forEach、map 的遍历行为(跳过空槽),却仍会被 for...in 或 'i' in arr 检测到,还可能触发 V8 引擎降级为字典模式,拖慢性能。
Java开发手册规约集合,基于阿里巴巴Java开发手册(嵩山版)。 涵盖7大维度:编程规约、异常日志、单元测试、安全规约、MySQL数据库、工程结构、设计规约。 当用户需要:(1) 编写或审查Java代码 (2) 检查命名/代码规范 (3) 处理异常和日志 (4) 编写单元测试 (5) 安全编码 (6) 数据库设...
- 要删数组元素,优先用
arr.splice(i, 1)(原地删)、arr.filter((_, idx) => idx !== i)(生成新数组) - 若只是想清空某位值而不删结构,赋
undefined或null更明确
区分“删除属性”和“置为 undefined”
obj.key = undefined 和 delete obj.key 行为完全不同:
- 前者保留属性键,
key in obj为true,for...in仍会遍历到它 - 后者真正从对象内部属性列表中剔除,
key in obj为false,遍历不可见 - 如果业务逻辑依赖
in操作符或hasOwnProperty判断字段是否存在,必须用delete
替代方案:需要不可变时用解构或 fromEntries
如果原始对象需保持不变(如 React state、Redux reducer、函数式编程场景),delete 就不适用——它直接修改原对象。此时应选无副作用方式:
- 已知键名:
const { unwanted, ...rest } = obj - 动态键名:
const key = 'dynamic'; const { [key]: _, ...rest } = obj - 通用过滤:
Object.fromEntries(Object.entries(obj).filter(([k]) => k !== key))
这些方法都返回新对象,原始对象完全不受影响,语义清晰,调试友好。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










