推荐用 Object.keys() + for...of 遍历自有可枚举字符串键;for...in 必须配合 hasOwnProperty() 过滤继承属性;需包含 Symbol 键时,应合并 Object.getOwnPropertyNames() 和 Object.getOwnPropertySymbols() 结果。
遍历 JavaScrip
t 对象有多种方式,核心在于区分“自有属性”和“继承属性”,以及是否需要处理 Symbol 类型的键。常用且安全的方法主要围绕 Object.keys()、Object.getOwnPropertyNames()、Object.getOwnPropertySymbols() 和 for...in 展开,配合 hasOwnProperty() 过滤是关键。
这是最常用、推荐的方案:只获取对象自身可枚举的字符串属性名,不包含原型链上的属性,也不包含 Symbol 键。
Object.keys(obj) 返回一个字符串数组,如 ['name', 'age']
for...of 或 forEach 即可安全遍历for...in 会遍历对象自身及原型链上所有可枚举属性(包括字符串和 Symbol),容易误读继承属性,必须手动过滤。
obj.hasOwnProperty(key) 判断是否为自有属性for...in 遍历到)若需完整覆盖(字符串键 + Symbol 键),不能只靠一种方法,要合并结果:
Object.getOwnPropertyNames(obj) → 获取所有自有字符串键(含不可枚举)Object.getOwnPropertySymbols(obj) → 获取所有自有 Symbol 键for...of 遍历这个混合数组,访问值时用 obj[key] 即可(Symbol 作键也支持)不检查 hasOwnProperty() 会导致遍历到原型方法(如 toString、valueOf),尤其在扩展原生原型或使用老旧库时极易出错。
for...in 的设计逻辑,所以过滤是必要步骤