for-in遍历对象自身及原型链上可枚举的字符串属性;需用hasOwnProperty()过滤继承属性;不可枚举属性和Symbol属性均不被遍历;推荐用Object.keys()等更安全的替代方案。

for-in 循环遍历的是对象自身及其原型链上所有可枚举(enumerable)且非 Symbol的属性。
只遍历自身属性:用 hasOwnProperty()
默认情况下,for-in 会顺着原型链向上查找,包括继承来的可枚举属性。若只想处理对象自身的属性,需配合 hasOwnProperty() 过滤:
-
obj.hasOwnProperty(prop)返回true表示该属性在obj自身上(而非原型上) - 这是最常用、最可靠的判断方式
示例:
<script>const parent = { a: 1 };
const child = Object.create(parent);
child.b = 2;
for (const key in child) {
if (child.hasOwnProperty(key)) {
console.log(key); // 输出 'b',不输出 'a'
}
}
</script>
跳过不可枚举属性:无需额外操作
JavaScript 中很多内置属性(如 Object.prototype.toString、Array.prototype.length)默认是不可枚举的。只要没显式设为 enumerable: true,for-in 就不会访问它们。
立即学习“Java免费学习笔记(深入)”;
- 用
Object.defineProperty()创建的属性,默认enumerable: false - 直接赋值的属性(如
obj.x = 1)默认enumerable: true
Symbol 属性完全不会被 for-in 遍历
for-in 只处理字符串键名的可枚举属性。Symbol 类型的键名无论是否可枚举,都不会出现:
- 要遍历 Symbol 属性,得用
Object.getOwnPropertySymbols()或Reflect.ownKeys() - 例如:
Reflect.ownKeys(obj)同时返回字符串键和 Symbol 键(按创建顺序)
替代方案建议
现代开发中,更推荐以下方式替代 for-in:
-
Object.keys(obj):只返回自身可枚举字符串键数组,安全可控 -
Object.getOwnPropertyNames(obj):返回自身所有字符串键(含不可枚举) -
for...of + Object.keys():语义清晰,避免原型污染风险
例如:for (const key of Object.keys(obj)) { ... }


















