JavaScript遍历对象需据需求选择:for...in遍历自身及原型可枚举属性(需hasOwnProperty过滤),Object.keys()仅遍历自身可枚举字符串键,Reflect.ownKeys()最全面(含不可枚举字符串键和所有Symbol键)。
JavaScript中遍历对象有多种方法,核心区别在于:是否遍历自身属性、是否包含不可枚举属性、是否处理Symbol键、是否递归嵌套。选哪种取决于具体需求。
遍历对象自身及原型链上所有可枚举属性(包括继承的)。实际使用时必须配合 hasOwnProperty() 过滤掉继承属性:
for (let key in obj) { if (obj.hasOwnProperty(key)) { console.log(key, obj[key]); } }
Object.prototype加了方法就会被遍历到)for...in 忽略 Symbol 类型的键返回一个由对象自身可枚举属性名(字符串)组成的数组,不包含Symbol键、不可枚举属性或原型链属性:
Object.keys(obj).forEach(key => console.log(key, obj[key]));for (const key of Object.keys(obj)) { console.log(key, obj[key]); }若需完整获取所有自有属性(含不可枚举字符串键 + 所有Symbol键),需两者结合:
立即学习“Java免费学习笔记(深入)”;
const keys = Object.getOwnPropertyNames(obj); // 字符串键(含不可枚举)const symbols = Object.getOwnPropertySymbols(obj); // Symbol键(无论是否可枚举)[...keys, ...symbols].forEach(key => console.log(key, obj[key]));
返回包含所有自有属性键的数组:字符串键(含不可枚举)+ Symbol键(无论是否可枚举),顺序按添加顺序(字符串在前,Symbol在后):
Reflect.ownKeys(obj).forEach(key => console.log(key, obj[key]));getOwnPropertyNames 和 getOwnPropertySymbols 更简洁不复杂但容易忽略细节:遍历前先想清楚——要继承属性吗?要Symbol吗?要不可枚举属性吗?选对方法,代码更健壮。