Object 的属性propertyIsEnumerable为true后,一定可遍历吗?

使用 Symbol 作为Object 的键值,默认会隐藏,这个在mdn-术语-symbol 中有看到,但是在 mdn-propertyIsEnumerable 中看到这样一句话

每个对象都有一个 propertyIsEnumerable 方法。此方法可以确定对象中指定的属性是否可以被 for...in 循环枚举

虽然Symbol可以通过propertyIsEnumerable 输出为true,但是为什么不能通过 for...in 来输出呢?

let a = {};
let b = Symbol('key');
a[b] = 'b';

console.log(a.propertyIsEnumerable(b)); // true

for (let i in a) {
  console.log(i) // 但是这里却不会输出 `Symbol` 
}
阅读 1.7k
2 个回答

Symbols 与 for...in 迭代

好像不能直接定位到位置。。。 你可以先打开链接,再搜下我的这个标题, 简单的说就是

Symbols 在 for...in 迭代中不可枚举

不是这样推导的。 for...in 本身就不能循环枚举 Symbol 类型的属性,也就是说既然你是 Symbol 类型就不要考虑用我了,跟属性本身的可枚举描述符无关了。换句话说,你不是 Symbol,你可以枚举,你可以用我 for...in 循环枚举,这是前提,官方的表述没问题。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题