对象字面量属性默认configurable、enumerable、writable均为true,value为指定值;计算属性名会强制转字符串(Symbol除外);判断存在性应区分hasOwnProperty、in操作符;configurable为false后仅锁定元信息,不影响值的修改。

对象字面量本身不显式声明属性描述符,但每个属性都默认具备一套行为边界——理解这些默认值及其限制,比手动调用 Object.defineProperty 更关键。真正容易出错的,不是“怎么设”,而是“没意识到它已经这么设了”。
字面量属性天然带默认描述符
用 { a: 1 } 创建的属性,其描述符实际等价于:
-
configurable: true —— 可被
delete,也可被重新定义 -
enumerable: true —— 会出现在
for...in和Object.keys()中 - writable: true —— 值可被重新赋值
- value: 1 —— 初始值
这和 Object.defineProperty(obj, 'a', { value: 1 }) 完全不同(后者四个布尔描述符默认都是 false)。别把字面量当成“无配置”的裸属性——它其实自带宽松策略。
动态键名要小心类型转换
计算属性名 { [key]: val } 中的 key 会被强制转为字符串:
立即学习“Java免费学习笔记(深入)”;
-
{ [42]: 'x' }→ 键是"42",不是数字 -
{ [{}]: 'y' }→{}调用toString()得"[object Object]" -
{ [Symbol('a')]: 'z' }→ 合法,Symbol 保留原值,不会转字符串
若依赖键的原始类型(比如想用数字键做数组式索引),得确认上下文是否真需要字符串化语义。
避免用值判断存在性
obj.prop !== undefined 是高危写法:
- 属性值本身就是
undefined,判断就失效 - 属性被设为
writable: false且值为undefined,照样误判 - 原型链上有同名属性但值为
undefined,也会干扰结果
正确做法分场景:
- 查自有属性是否存在 → 用
obj.hasOwnProperty('prop') - 查是否可访问(含原型)→ 用
'prop' in obj - 查属性值是否真有意义 → 单独判断值,但不要混在“存在性”逻辑里
改描述符前先确认 config 状态
一旦某个属性的 configurable 设为 false,就锁死了三件事:
- 不能再
delete它 - 不能再用
defineProperty改它的enumerable、writable或configurable - 不能再把数据属性改成访问器属性,或反过来
但注意:configurable: false 不影响 writable: true 时的赋值操作。很多人以为“锁死”=“不可改值”,其实只是不可改元信息。


















