for...in循环遍历对象自身及原型链上可枚举的字符串键名属性,不保证顺序,会跳过不可枚举属性和Symbol键,需用hasOwnProperty()过滤自身属性,数组应避免使用。

for...in 循环用于遍历对象自身及其原型链上**可枚举(enumerable)的字符串键名属性**,它不保证遍历顺序,也不区分属性是否来自对象自身。
只遍历可枚举属性
JavaScript 中每个属性都有一个 enumerable 描述符,默认为 true。只有该值为 true 的属性才会被 for...in 遍历到。
- 用
Object.defineProperty()显式设为false的属性会被跳过 - 数组的
length、方法(如push、forEach)等原生属性通常不可枚举,不会出现在for...in中 - Symbol 类型的键名永远不会被
for...in遍历(即使可枚举)
会遍历原型链上的可枚举属性
for...in 不仅检查对象自身,还会向上查找其整个原型链,只要某个可枚举属性存在于原型上,就会被遍历到。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 例如:如果给
Object.prototype添加了一个可枚举属性,所有普通对象都会“继承”并遍历到它(不推荐这种操作) - 常用防护写法是配合
hasOwnProperty()判断是否为自身属性:
if (obj.hasOwnProperty(key)) {
console.log(key, obj[key]);
}
}
不适用于数组遍历
虽然技术上可以对数组使用 for...in,但它是按属性名(字符串索引)遍历,且可能包含非数字键或原型上的可枚举属性,容易出错。
立即学习“Java免费学习笔记(深入)”;
- 数组索引是字符串形式的属性名(如
"0"、"1"),但for...in不保证顺序 - 若数组被扩展了额外属性(如
arr.name = "myList"),也会被遍历到 - 推荐数组用
for、for...of或forEach()
替代方案更可控
如需只遍历对象自身可枚举属性,优先考虑:
-
Object.keys(obj)→ 返回自身可枚举属性的字符串键数组(最常用) -
Object.getOwnPropertyNames(obj)→ 包含不可枚举属性(除 Symbol) -
Object.getOwnPropertySymbols(obj)→ 获取自身 Symbol 键 -
Reflect.ownKeys(obj)→ 返回所有自身键(字符串 + Symbol)

















