Object.keys()返回对象自身可枚举属性的字符串键数组,按定义顺序排列,不包含原型链属性和不可枚举属性;对非对象参数,ES6起严格报错,ES5则尝试包装转换。

Object.keys() 是 JavaScript 中用于获取对象自身所有可枚举属性键名的标准方法,返回一个由字符串组成的数组,顺序与 for...in 循环一致(即按属性定义顺序,不包括原型链上的属性)。
基本用法很简单
直接传入一个对象,它会忽略不可枚举属性(如通过 Object.defineProperty 设置 enumerable: false 的属性),也**不会遍历原型链**上的属性:
-
Object.keys({ a: 1, b: 2 })→["a", "b"] -
Object.keys([])→[](空数组) -
Object.keys(null)或Object.keys(undefined)会抛出 TypeError
只返回自身可枚举属性,不包含继承属性
即使父对象有可枚举属性,子对象调用 Object.keys() 也不会拿到它们:
const parent = { x: 1 }; const child = Object.create(parent); child.y = 2;-
Object.keys(child)→["y"](x来自原型,不被包含)
无法获取不可枚举属性,需用其他方法补充
如果对象中存在不可枚举属性(比如 Object.prototype.toString 默认不可枚举),Object.keys() 不会返回它们。此时可结合 Object.getOwnPropertyNames() 或 Reflect.ownKeys():
-
Object.getOwnPropertyNames(obj):返回所有自身属性键名(含不可枚举) -
Reflect.ownKeys(obj):返回所有自身属性键名(含不可枚举 + Symbol 类型键)
注意类型转换和边界情况
传入非对象参数时,ES5 会尝试强制转为对象;ES6 开始严格要求必须是对象类型:
-
Object.keys("abc")→["0", "1", "2"](字符串被包装成 String 对象) -
Object.keys(42)→[](数字被包装,但无自有可枚举属性) -
Object.keys(Symbol())→ 抛出 TypeError(Symbol 不是对象,也不能转成有属性的对象)


















