for...in 是唯一默认遍历原型链上可枚举字符串键的循环方式;其他方法如 object.keys()、reflect.ownkeys() 等均只处理对象自身属性,不访问原型链。

只有 for...in 循环默认会包含原型链上的可枚举属性。
for...in 是唯一自动遍历原型链的遍历方式
它会依次访问对象自身 + 整条原型链上所有 可枚举(enumerable: true) 的字符串键属性。比如你给 Object.prototype 添加了一个可枚举属性,所有普通对象用 for...in 都会看到它。
- 不区分自有还是继承,只要在原型链上且可枚举,就会被列出
- Symbol 类型的属性不会被遍历到
- 不可枚举属性(如
Object.defineProperty(obj, 'x', { enumerable: false }))也不会出现
其他常用方法都不访问原型链
它们全部只处理对象自身的属性:
-
Object.keys():只返回自身可枚举的字符串键 -
Object.getOwnPropertyNames():返回自身所有字符串键(含不可枚举) -
Object.getOwnPropertySymbols():返回自身所有 Symbol 键 -
Reflect.ownKeys():返回自身所有键(字符串 + Symbol,无论是否可枚举) -
Object.values()和Object.entries():行为分别对应Object.keys(),只是返回值或键值对
想安全遍历自身属性?推荐这样选
日常开发中,绝大多数场景只需操作对象自己定义的属性:
- 要遍历键 → 用
Object.keys(obj) - 要遍历值 → 用
Object.values(obj) - 要同时用键和值 → 用
Object.entries(obj),支持解构 - 需要不可枚举属性或 Symbol → 用
Reflect.ownKeys(obj)
除非你明确需要检查原型链(比如做调试、框架元编程),否则不用 for...in。真要用,务必加 obj.hasOwnProperty(key) 过滤。











