object.keys()返回对象自身所有可枚举的字符串属性名组成的数组;它不包含继承属性、不可枚举属性(enumerable: false)和symbol键,仅限自有且enumerable为true的字符串键。

Object.keys() 就是专门干这个事的:获取对象自身所有可枚举的字符串属性名,返回一个字符串数组。
它不看原型链、不收不可枚举属性、也不理 Symbol 类型的键——只专注“自己有的、能被 for...in 遍到的那些字符串键”。
它怎么判断“自身”和“可枚举”?
-
“自身”:只返回对象直接拥有的属性,不会包含从
Object.prototype或其他原型上继承来的属性。 -
“可枚举”:指属性描述符中
enumerable: true(默认新建属性就是 true;但用Object.defineProperty显式设为false的,或 ES6 class 中定义的方法,就不会被Object.keys()捕获)。
比如:
const obj = { a: 1, b: 2 };
Object.defineProperty(obj, 'c', { value: 3, enumerable: false });
obj.__proto__.d = 4; // 继承属性
console.log(Object.keys(obj)); // ['a', 'b']
这里 'c' 不可枚举,'d' 是继承的,都被过滤掉了。
常见使用方式
-
直接调用,传入目标对象:
const user = { name: '李四', role: 'admin', active: true }; console.log(Object.keys(user)); // ['name', 'role', 'active'] -
结合
forEach、map遍历取值:Object.keys(user).forEach(key => { console.log(`${key}: ${user[key]}`); }); -
获取第一个属性名(注意:顺序按规范是确定的):
const firstKey = Object.keys(user)[0]; // 'name'
和其他方法对比一下
| 方法 | 自身属性 | 可枚举 | 不可枚举 | Symbol 键 |
|---|---|---|---|---|
Object.keys() |
✅ | ✅ | ❌ | ❌ |
Object.getOwnPropertyNames() |
✅ | ✅ | ✅ | ❌ |
Object.getOwnPropertySymbols() |
✅ | — | — | ✅ |
Reflect.ownKeys() |
✅ | ✅ | ✅ | ✅ |
如果你只需要“能被常规遍历看到的那些键”,Object.keys() 最简洁、最常用,也最符合日常开发直觉。
不复杂但容易忽略细节











