Object.entries 返回一个二维数组,每个子项为[key, value]形式的数组,仅包含对象自身的可枚举字符串键值对。

Object.entries 返回的是什么结构
Object.entries 把对象转成二维数组,每个子项是 [key, value] 形式的数组。不是对象、不是 Map、也不是字符串——这点容易被忽略,导致后续解构出错。
常见错误现象:for...of 循环里直接对 Object.entries(obj) 的返回值做 item.key 或 item.value 访问,结果全是 undefined。
- 正确做法是用数组解构:
for (const [key, value] of Object.entries(obj)) - 如果想保留原始项结构,也可以写成
for (const item of Object.entries(obj)) { const key = item[0]; const value = item[1]; },但不够直观 - 注意兼容性:
Object.entries在 IE 中完全不支持,Node.js 从 v7.0.0 开始支持
为什么不用 for...in + hasOwnProperty
for...in 会遍历原型链上的可枚举属性,哪怕加了 hasOwnProperty 检查,也得额外写一层判断;而 Object.entries 只返回对象自身的可枚举键值对,天然安全。
使用场景:当你明确只关心对象自身属性(比如配置对象、API 响应体、表单数据),且需要同时用到 key 和 value 时,Object.entries + for...of 是更干净的选择。
-
for...in还可能受Object.prototype被污染影响(虽然现代框架很少这么干) -
Object.entries返回数组,意味着你可以随时接.filter()、.map()等链式操作,for...in不行 - 性能上差异极小,不必为此优化,但可读性提升明显
遇到 Symbol 键或不可枚举属性怎么办
Object.entries 完全忽略 Symbol 类型的键,也跳过 enumerable: false 的属性。这是它的设计行为,不是 bug。
如果你确实需要处理 Symbol 键,得换方法:Reflect.ownKeys(obj) 能拿到所有自有键(包括 Symbol),再配合 obj[key] 手动取值。
- 示例:
for (const key of Reflect.ownKeys(obj)) { console.log(key, obj[key]); } - 不可枚举属性(如
Object.defineProperty(obj, 'hidden', { value: 42, enumerable: false }))同样不会出现在Object.entries结果中 - 没有“一行代码同时覆盖 Symbol + 字符串键 + 不可枚举”的通用方案,必须按需组合 API
嵌套对象或需要提前退出时怎么写
for...of 支持 break 和 continue,这点比 Object.keys().forEach() 灵活得多——后者没法中途跳出。
但如果嵌套层级深,别硬套 Object.entries 多层展开,容易让逻辑缠绕。先想清楚:你是要扁平化遍历,还是逐层处理?
- 扁平化需求(如查找某个 value):用递归函数封装
Object.entries更清晰 - 逐层处理(如日志打印每一层 key):在循环体内判断
typeof value === 'object' && value !== null,再递归调用 - 避免在循环里修改正在遍历的对象(比如 delete 某个 key),这不会影响当前迭代,但会让后续逻辑难推理
真正容易被忽略的点是:很多人以为 Object.entries 是“遍历对象的标准答案”,其实它只解决“自身可枚举字符串键”这一种情况。实际项目里,得先确认你的数据结构是否真属于这个范畴,再决定要不要加兜底逻辑。











