object.values()和object.entries()是转化对象为可迭代结构最自然高效的方式,前者提取值数组,后者获取键值对二维数组,均只处理自身可枚举属性,语义清晰、性能轻量。

直接用 Object.values() 提取值数组,用 Object.entries() 获取键值对二维数组,是转化对象为可迭代结构最自然、高效的方式。两者都只处理对象自身的可枚举属性,不遍历原型链或 Symbol 键,语义清晰、性能轻量。
只取值?用 Object.values() 最简洁
当你只需操作对象的值(比如求和、过滤字符串、批量转换),Object.values() 是首选。它返回纯值数组,顺序与属性定义顺序一致,天然支持 forEach、map、reduce 等数组方法。
- 基础用法:
Object.values({ a: 1, b: 'x', c: true })→[1, 'x', true] - 配合
reduce计算总和:Object.values(salaries).reduce((s, v) => s + v, 0) - 过滤并转换:
Object.values(data).filter(v => typeof v === 'string').map(s => s.trim()) - 注意:函数、
null、undefined、嵌套对象等原样保留;不可枚举属性(如Object.defineProperty(obj, 'hidden', { enumerable: false }))不会出现
需同时访问键和值?选 Object.entries()
Object.entries() 返回形如 [['key1', val1], ['key2', val2]] 的二维数组,适合需要键值联动的场景,比如生成查询参数、按字段名校验、构建新对象结构。
- 解构遍历更直观:
Object.entries(config).map(([k, v]) => `${k}=${v}`) - 转成 URL 查询串:
Object.entries(params).map(([k, v]) => `${encodeURIComponent(k)}=${encodeURIComponent(v)}`).join('&') - 按键名筛选:
Object.entries(user).filter(([k]) => k.startsWith('is')).map(([k, v]) => ({ [k]: v })) - 可直接传给
Map构造函数:new Map(Object.entries(obj))
组合使用提升灵活性
单独用某个方法已够用,但遇到复杂转换时,把 values 或 entries 和数组方法链式配合,能替代冗长的 for...in 或 Object.keys().map() 写法。
- 提取嵌套对象中的某字段:
Object.values(users).map(u => u.name) - 把键值对转成带 key 字段的对象数组:
Object.entries(stats).map(([k, v]) => ({ key: k, value: v })) - 先筛键再取值:
Object.entries(obj).filter(([k]) => k !== 'id').map(([, v]) => v) - 避免重复计算:如果既需要键又需要值,优先用
entries(),而不是分别调用keys()和values()
注意边界情况
这两个方法行为稳定,但几个细节容易出错,需留意:
- 传入
null或undefined会直接报TypeError,建议加判断:obj && Object.values(obj) - 类数组对象(如
arguments、某些 DOM 集合)不是普通对象,Object.entries()可能返回意外结果,应先确认类型 - 数字键在严格模式下会被自动排序(如
{ 2: 'b', 1: 'a' }→ entries 顺序为[[1,'a'],[2,'b']]),字符串键保持插入顺序 - getter 属性会被执行并取其返回值;setter 不触发











