JavaScript 中 configurable 语义在严格模式下的体现

作者:袖梨 2026-07-01
configurable 控制属性是否可删除及重新配置,严格模式下删除不可配置属性会抛出 TypeError,而非严格模式仅返回 false;configurable: true 是 delete 成功的唯一前提。

JavaScript 中 configurable 控制的是属性是否可被删除、是否可被重新配置(比如改写 writableenumerable 或再次定义 get/set)。它在严格模式下最直接的体现,就是让“试图删除不可配置属性”这一操作从静默失败变成明确报错。

不可删除的属性在严格模式下会抛出 TypeError

非严格模式下,对 configurable: false 的属性使用 delete 会返回 false,但不报错;严格模式下,这会直接触发运行时错误。

  • 全局变量声明(如 var x = 1)创建的属性,默认 configurable: false,无法删除
  • Object.defineProperty 显式设为 configurable: false 的属性,也无法删除
  • 函数形参、arguments 对象的属性、部分内置对象属性(如 Array.prototype.length)也默认不可配置

严格模式强化了 configurable 的约束力

它不只是影响 delete 操作,还统一了对属性描述符修改的限制逻辑:

  • 尝试将 configurable: false 的属性改为 configurable: true —— 严格模式下报错
  • 尝试修改该属性的 valuewritable 等其他描述符(只要 configurablefalse)—— 同样报错(除非只改 valuewritable: true
  • 对象本身若被设为不可扩展(Object.preventExtensions()),再加新属性也会在严格模式下报错,这与 configurable 的“不可逆性”精神一致

configurable 和 delete 的关系是核心表现点

这是开发者最容易踩坑的地方。例如:

立即学习“Java免费学习笔记(深入)”;

"use strict";var obj = {};Object.defineProperty(obj, 'name', {  value: 'Alice',  configurable: false});delete obj.name; // TypeError: Cannot delete property 'name' of object

而如果把 configurable: true,哪怕其他描述符都设为 falsedelete 就能成功:

  • configurable: true 是唯一允许后续调用 delete 的前提
  • delete 成功后,该属性彻底从对象上移除,不再参与任何属性访问或枚举
  • 即使 writable: falseenumerable: false,只要 configurable: true,仍可删

严格模式让 configurable 的语义更“诚实”

它消除了非严格模式下那种“假装删了但其实没删”的模糊行为,强制开发者直面属性的设计意图:

  • 你定义一个不可配置属性,就等于说“这个属性是契约的一部分,不该被外部破坏”
  • 严格模式让这个契约在运行时具有效力,而不是靠文档或约定来维系
  • 这对构建健壮的库、封装私有状态、防止意外覆盖非常关键

相关文章

精彩推荐