object.keys、object.values 和 object.entries 是 javascript 中遍历对象自身可枚举属性的三个核心静态方法,分别返回键名数组、键值数组和键值对二维数组,均不包含继承属性、不可枚举属性及 symbol 键。

Object.keys、Object.values 和 Object.entries 是 JavaScript 中遍历对象的三个核心静态方法,它们分别返回对象自身可枚举属性的键、值和键值对数组,适用于大多数对象遍历场景。
Object.keys:获取所有可枚举属性名
它返回一个字符串数组,包含对象自身所有可枚举(enumerable: true)的属性名,不包括继承属性或 Symbol 类型键。
- 顺序与 for...in 一致:按属性定义顺序(严格模式下,数字键会自动排序,字符串键保持插入顺序)
- 忽略不可枚举属性:如 Object.defineProperty(obj, 'hidden', { enumerable: false, value: 42 }) 定义的属性不会出现
- 不处理 Symbol 键:Symbol('a') 作为属性名时不会被 keys 捕获
const user = { name: 'Alice', age: 30 }; console.log(Object.keys(user)); // ['name', 'age']
Object.values:提取所有可枚举属性值
返回一个数组,元素顺序与 Object.keys 的结果一一对应,即第 i 个值对应第 i 个键的值。
- 值类型保持原样:函数、null、undefined、对象等都会原封不动放入数组
- 不保证引用一致性:若属性是对象,数组中存的是该对象的引用,不是深拷贝
- 遇到 getter 属性会执行 getter 并取其返回值
const data = { a: 1, b: () => {}, c: null }; console.log(Object.values(data)); // [1, () => {}, null]
Object.entries:同时获取键与值的二维数组
返回一个数组,每个元素是长度为 2 的数组 [key, value],适合需要同时操作键和值的场景,比如转为 Map 或解构遍历。
- 可直接用于 for...of 循环并结构赋值:
for (const [k, v] of Object.entries(obj)) { ... } - 兼容 Map 构造:new Map(Object.entries(obj)) 可快速将普通对象转为 Map 实例
- 不包含原型链上的属性,也不含不可枚举或 Symbol 键
const cfg = { theme: 'dark', lang: 'zh' }; for (const [key, val] of Object.entries(cfg)) { console.log(`${key}: ${val}`); }
注意事项与常见误区
这三个方法都只处理对象自身的可枚举属性,不访问原型链。如果需遍历包括继承属性,应配合 for...in + hasOwnProperty 使用;若要包含 Symbol 键,需用 Object.getOwnPropertySymbols 或 Reflect.ownKeys。
- 无法反映动态变化:返回的是调用时刻的快照,后续增删属性不影响已返回的数组
- 不能替代 for...in 判断属性来源:Object.keys 不会过滤掉从原型继承的可枚举属性(因为默认不继承——除非手动设置 prototype 上的属性为 enumerable)
- 性能敏感场景注意:对大对象频繁调用会创建新数组,必要时可缓存结果











