object.getownpropertysymbols 返回对象自身所有 symbol 键,不受 enumerable、configurable 或 writable 描述符影响;仅要求键为 symbol 类型且为自身属性。

Object.getOwnPropertySymbols 不受属性描述符(如 configurable、enumerable、writable)的影响。
Symbol 属性本身可被枚举,但仅限于 getOwnPropertySymbols
只要一个 Symbol 类型的 key 是对象自身的属性(非继承),无论其 enumerable 值是 true 还是 false,Object.getOwnPropertySymbols(obj) 都会返回它。这是因为该方法的设计目标就是**获取对象自身所有 Symbol 键**,不筛选、不过滤,与属性的 enumerable 状态无关。
-
Object.keys()和for...in只返回可枚举的字符串键,且忽略 Symbol 键 -
Object.getOwnPropertyNames()返回所有自身字符串键(无论enumerable),但不包含 Symbol 键 -
Object.getOwnPropertySymbols()返回所有自身 Symbol 键(无论enumerable、configurable或writable)
描述符只影响操作行为,不影响 getOwnPropertySymbols 的结果
属性描述符控制的是对该属性的操作权限(比如能否删除、是否可遍历、能否重赋值),但不会让 getOwnPropertySymbols “看不见”这个 Symbol 属性。即使你用 Object.defineProperty 显式设置 enumerable: false,该 Symbol 键仍会出现在 getOwnPropertySymbols 返回数组中。
- 设
enumerable: false→ 不影响getOwnPropertySymbols,但该 Symbol 键不会出现在Reflect.ownKeys()的 Symbol 部分?错——Reflect.ownKeys()包含所有自身键(字符串 + Symbol),同样不受enumerable影响 - 设
configurable: false→ 无法再用defineProperty修改描述符或删除该 Symbol 属性,但getOwnPropertySymbols依然能列出它 - 设
writable: false→ 不能修改属性值(若为数据属性),也不影响getOwnPropertySymbols的返回结果
验证方式简单直接
可以快速写一段代码确认:
const obj = {};
const sym = Symbol('test');
Object.defineProperty(obj, sym, {
value: 42,
enumerable: false,
configurable: false,
writable: false
});
console.log(Object.getOwnPropertySymbols(obj)); // [Symbol(test)]
console.log(Object.getOwnPropertyDescriptor(obj, sym));
// { value: 42, writable: false, enumerable: false, configurable: false }
输出明确显示:Symbol 属性存在,描述符按设定生效,但 getOwnPropertySymbols 完全无视这些设定,照常返回。
真正决定“是否被 getOwnPropertySymbols 获取”的唯一条件
只有两个条件同时满足时,Symbol 键才会被 getOwnPropertySymbols 返回:
- 该 Symbol 是作为对象的**自身属性**(即不是原型链上继承来的)
- 该属性的 key 确实是一个
Symbol类型值(而非字符串、数字等)
除此之外,无任何描述符或隐藏标志会影响其可见性。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











