对象字面量属性定义顺序不影响值或行为,但决定遍历顺序且默认描述符writable、enumerable、configurable均为true;整数索引键按数值升序排前,其余字符串键按书写顺序排列,symbol键排最后;字面量无法直接设置描述符,需object.defineproperty()等api运行时干预。

对象字面量中属性的定义顺序本身不影响属性值或行为,但它会影响后续遍历的顺序,且默认生成的属性描述符与通过 Object.defineProperty() 显式定义的有关键差异。
字面量创建的属性默认描述符
用 { a: 1, b: 2 } 这种方式定义的属性,其描述符中三个布尔特性默认全为 true:
- writable:属性值可被重新赋值
-
enumerable:属性会在
for...in、Object.keys()中出现 - configurable:属性可被删除,描述符也可被修改(比如改成访问器)
这意味着字面量属性“开箱即用”,但也更易被意外修改或删除。
属性遍历顺序受定义顺序影响
ES2015 起,JavaScript 规定了自有属性的枚举顺序,而字面量中属性的书写顺序直接决定字符串键的插入顺序:
- 整数索引键(如
"0"、"10")按数值升序排在最前 - 其余字符串键严格按你写在字面量里的先后顺序排列
- Symbol 键总是排在最后,也按声明顺序
例如:{ c: 1, '2': 'two', a: 3, '0': 'zero' } 经 Object.getOwnPropertyNames() 返回的是 ['0', '2', 'c', 'a'],不是字典序,也不是书写序,而是先整数索引再其他字符串键的插入序。
描述符不能靠字面量直接设置
对象字面量语法不支持指定 writable、configurable 等描述符字段。如果需要锁定某个属性(比如只读、不可删),必须用 Object.defineProperty() 单独配置:
- 想让
obj.name不可改?得写Object.defineProperty(obj, 'name', { value: 'Alice', writable: false }) - 想隐藏某个属性不让
Object.keys()暴露?设enumerable: false - 想拦截读写操作?只能用
get/set定义访问器属性,字面量不支持这种写法
查看和批量管理描述符
字面量创建后,若需检查或统一调整描述符,可用以下方法:
-
Object.getOwnPropertyDescriptor(obj, 'prop')查单个属性的完整描述符 -
Object.getOwnPropertyDescriptors(obj)获取所有自身属性的描述符对象,便于复制、修改后批量重定义 - 配合
Object.defineProperties()可一次性设置多个属性的描述符
注意:这些 API 不改变字面量本身的语法限制,只是提供运行时干预能力。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











