为什么Symbol作为对象属性键后,用Object.keys看不到它?

迷人的静欣 阅读 59

我在用Symbol类型做对象私有属性时遇到问题。比如这样定义:


const sym = Symbol('test');
const obj = {
  name: 'Alice',
  [sym]: 'secret'
};

然后用Object.keys(obj)只得到[‘name’],连for…in循环也拿不到Symbol键对应的属性。但用obj[sym]又可以正常读取值。这是为什么?难道每次都要手动记录Symbol变量才能访问吗?

我来解答 赞 12 收藏
二维码
手机扫码查看
1 条解答
长孙树泽
这是因为 Symbol 类型的键在设计时就被定义为不会出现在 Object.keys()Object.getOwnPropertyNames() 或者 for...in 循环中。它是一种“半私有”的属性,虽然可以通过对象直接访问(比如 obj[sym]),但不会被常规的属性枚举方法捕获。

如果你想获取一个对象上所有的 Symbol 键,可以使用 Object.getOwnPropertySymbols() 方法。试试这个方法:

const sym = Symbol('test');
const obj = {
name: 'Alice',
[sym]: 'secret'
};

console.log(Object.keys(obj)); // ["name"]
console.log(Object.getOwnPropertySymbols(obj)); // [Symbol(test)]


所以,当你需要处理 Symbol 键时,记得用专门的方法去获取它们。确实,如果你不记录 Symbol 变量本身,就没法通过名字直接访问对应的值——这就是它“私有化”特性的一部分吧。不过这也算是 JS 的一种保护机制啦,避免属性意外暴露。
点赞 8
2026-01-31 19:09