object.keys() 返回数组而非迭代器,需通过[symbol.iterator]()获取键名迭代器;更推荐用object.entries().keys()直接获得标准键名迭代器,语义清晰且原生支持。

JavaScript 中获取对象键名最常用、最直接的方式是 Object.keys(),它返回一个包含对象自身可枚举属性键名的数组,不是迭代器;但如果你需要的是真正的 keys 迭代器(即能用 for...of 或手动调用 .next() 的迭代器对象),那得用 Object.keys(obj)[Symbol.iterator]() 或更推荐的 Object.entries(obj).keys() 等方式。
Object.keys() 返回数组,不是迭代器
Object.keys(obj) 是最常用的键名提取方法,但它返回的是普通数组,不是迭代器。虽然数组本身有 [Symbol.iterator],但你需要显式调用才能得到迭代器:
const iter = Object.keys(obj)[Symbol.iterator]();- 然后可用
iter.next()逐个取键名,例如:iter.next().value - 或配合
for...of:for (const key of Object.keys(obj)) { ... }—— 这里实际是用了数组内置的迭代器
直接获取 keys 迭代器:Object.keys(obj).values() 不对,要用 Symbol.iterator
严格来说,Object.keys() 本身不返回迭代器,但你可以从结果数组拿到迭代器:
const keyIter = Object.keys(obj)[Symbol.iterator]();- 也可以封装成函数:
const keysIter = (obj) => Object.keys(obj)[Symbol.iterator](); - 注意:
Object.keys(obj).values()是无效写法(数组没有.values()方法;Map.prototype.values()才有)
更现代的做法:用 Object.entries().keys() 获取纯键名迭代器
Object.entries(obj) 返回 [key, value] 数组,它本身是可迭代的,且提供 .keys() 方法(返回只遍历键名的迭代器):
const keyIter = Object.entries(obj).keys();- 这个
keyIter就是标准的迭代器对象,支持.next()和for...of - 优点:语义清晰,原生支持,无需额外转换;缺点:比
Object.keys()多一次键值对生成(性能敏感场景需留意)
兼容性与注意事项
所有上述方法都要求对象是普通 JavaScript 对象(非 null),且只遍历自身可枚举属性(不含原型链上的键):
-
Object.keys()和Object.entries()都忽略不可枚举属性(如Object.defineProperty(obj, 'x', { enumerable: false })) - 若需包括不可枚举键,要用
Object.getOwnPropertyNames()或Reflect.ownKeys(),它们也返回数组,同样可接[Symbol.iterator]() - ES2015+ 环境均支持,无需 polyfill
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











