object.values()提取对象自身可枚举属性值数组,object.entries()返回键值对二维数组;二者均按属性定义顺序排列,适用于值操作、键值联动及数据转换场景。
object.values() 和 object.entries() 是 javascript 中处理对象转数组的两个高效工具,能避免手动遍历,让代码更简洁、可读性更强。
用 Object.values() 快速提取所有值
当你只关心对象的值(value),不关心键(key)时,Object.values() 是最直接的选择。它返回一个由对象自身可枚举属性值组成的数组,顺序与 for...in 循环一致(即按属性定义顺序)。
- 忽略属性键名,适合统计、映射或批量操作值的场景
- 不包含原型链上的属性,只取对象自身的可枚举属性
- 对 Symbol 键名的属性默认不包含(除非显式定义为可枚举)
例如:
const user = { name: 'Alice', age: 30, city: 'Beijing' };const values = Object.values(user); // ['Alice', 30, 'Beijing']
用 Object.entries() 同时获取键值对数组
Object.entries() 返回一个二维数组,每个子项是 [key, value] 形式的数组,天然适配 map、filter、reduce 等数组方法,也方便解构。
- 适合需要同时访问键和值的逻辑,比如生成查询参数、校验字段、构建新结构
- 结果顺序与 Object.keys() / Object.values() 一致,保持定义顺序
- 可配合数组解构快速拆分:entries.map(([key, val]) => ...)
例如:
const config = { theme: 'dark', lang: 'zh', autoSave: true };const entries = Object.entries(config);
// [['theme', 'dark'], ['lang', 'zh'], ['autoSave', true]]
// 转成 URL 查询字符串
const queryString = entries.map(([k, v]) => `${encodeURIComponent(k)}=${encodeURIComponent(v)}`).join('&');
组合使用提升数据转换灵活性
两者常与数组方法链式配合,替代冗长的 for...in 或 Object.keys().map() 写法。关键是根据目标选择起点:只要值 → values;要键值关系 → entries。
- 过滤并转换值:
Object.values(obj).filter(v => typeof v === 'string').map(s => s.toUpperCase()) - 基于键筛选键值对:
Object.entries(obj).filter(([k]) => k.startsWith('is')).map(([k, v]) => ({ [k]: v })) - 转为 Map 实例:
new Map(Object.entries(obj)),便于后续增删查改
注意兼容性与边界情况
这两个方法在现代浏览器和 Node.js(v6+)中已广泛支持,但若需兼容 IE,则需 polyfill 或降级为 Object.keys() + map。
- 对 null 或 undefined 调用会抛错,建议加类型判断:
obj && typeof obj === 'object' ? Object.values(obj) : [] - 不可枚举属性(如通过 Object.defineProperty 添加且 enumerable: false)不会被包含
- 数值索引属性(如 { 0: 'a', 1: 'b' })会被视为普通键,仍按定义顺序处理,不会自动转为类数组










