Object.keys 用于获取对象自身可枚举属性名的字符串数组,按定义顺序排列,不包含原型链属性和不可枚举属性;它本身不遍历,需配合 for、forEach 等使用,且对 null/undefined 会报错。

Object.keys 不是用来“遍历”的,而是用来获取对象自身可枚举属性名的数组——拿到这个数组后,你才能用 for、forEach 等方式去遍历。
Object.keys 返回的是字符串数组
它只返回对象**自身**(不包括原型链上)、且**可枚举**(enumerable: true)的属性名,按属性定义顺序排列(ES2015+ 保证顺序)。
例如:
const obj = { a: 1, b: 2, c: 3 };
console.log(Object.keys(obj)); // ['a', 'b', 'c']
配合 for 或 forEach 遍历属性值
有了键名数组,就可以安全访问对应属性值。注意:不要直接用 obj[key] 访问可能不存在的属性,但通常已知是自有属性,所以没问题。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
- 用
forEach:
Object.keys(obj).forEach(key => {
console.log(key, obj[key]); // 'a' 1, 'b' 2, 'c' 3
});
- 用
for...of:
for (const key of Object.keys(obj)) {
console.log(key, obj[key]);
}
和 for...in 的区别要清楚
Object.keys 不会遍历继承属性,也不遍历不可枚举属性;而 for...in 会遍历整个原型链上的可枚举属性。
比如:
const parent = { x: 10 };
const child = { y: 20 };
Object.setPrototypeOf(child, parent);
Object.defineProperty(child, 'z', { value: 30, enumerable: false });
console.log(Object.keys(child)); // ['y'] —— 只有自有、可枚举
for (let k in child) console.log(k); // 'y', 'x' —— 包括继承的 'x'
常见误用提醒
- 别把它当“遍历方法”直接调用——它本身不执行循环,只是准备数据;
- 它不能替代
Object.entries()或Object.values(),如果需要值或键值对,优先选更匹配的 API; - 对 null 或 undefined 调用会报错,使用前建议做类型判断:
obj && typeof obj === 'object'; - 类数组对象(如 arguments、NodeList)需先转为普通对象,否则
Object.keys可能返回空数组或意外结果。

















