信息发布→ 登录 注册 退出

javascript如何遍历对象_有哪些方法可以获取对象的键值?

发布时间:2026-01-05

点击量:
Object.keys()和Object.values()最常用但只返回自有可枚举属性;for...in需hasOwnProperty过滤原型链;Object.entries()适合键值同处理;Reflect.ownKeys()唯一获取所有自有键(含Symbol和不可枚举)。

Object.keys() 和 Object.values() 最常用,但只返回自有可枚举属性

这两个方法是日常开发中最直接的取键/取值方式,但要注意它们**不会遍历原型链上的属性**,也**跳过不可枚举属性(如 Object.defineProperty 设置的 enumerable: false 的属性)**。

  • Object.keys(obj) 返回字符串数组,比如 ['a', 'b']
  • Object.values(obj) 返回值数组,顺序与 keys() 一致
  • 两者都不保证属性顺序(ES2015+ 规范中,对象属性遍历顺序已定义:数字索引按升序,其余按插入顺序;但老引擎或特殊场景下仍需留意)

for...in 循环能遍历原型链,必须配合 hasOwnProperty 过滤

for...in 会遍历对象自身及原型链上所有**可枚举属性**,这是它和 Object.keys() 的关键区别。不加防护直接用,很容易误读到 toStringhasOwnProperty 等继承方法。

  • 务必用 obj.hasOwnProperty(key) 判断是否为自有属性
  • 不能用于 MapSet 等内置集合类型(它们没有可枚举属性)
  • 若对象被冻结(Object.freeze())或属性设为不可枚举,for...in 仍会跳过

Object.entries() 适合需要同时处理键和值的场景

Object.entries(obj) 返回二维数组,如 [ ['a', 1], ['b', 2] ],天然适配 for...ofArray.prototype.map() 等数组方法。

  • 比分别调用 keys()values() 更高效(底层只遍历一次)
  • 结果数组的每个子项是长度为 2 的数组,解构时注意写法:for (const [key, value] of Object.entries(obj)) { ... }
  • 同样只返回自有可枚举属性,不包含 Symbol 键(Symbol('a') 类型的键)

Reflect.ownKeys() 是唯一能拿到所有自有键(含 Symbol 和不可枚举)的方法

当你需要完整“镜像”一个对象结构(比如做深拷贝、序列化、代理拦截),Reflect.ownKeys() 是最全的选择。它等价于 Object.getOwnPropertyNames(obj).concat(Object.getOwnPropertySymbols(obj))

立即学习“Java免费学习笔记(深入)”;

  • 返回所有自有属性键:字符串键(包括不可枚举的) + 所有 Symbol 键
  • 要获取对应值,得手动搭配 Object.getOwnPropertyDescriptor()Object.getPrototypeOf() 判断
  • 性能略低,一般场景不需要——多数时候你并不想处理 constructor__proto__ 这类内部属性
const obj = { a: 1 };
Object.defineProperty(obj, 'b', { value: 2, enumerable: false });
const sym = Symbol('c');
obj[sym] = 3;

console.log(Reflect.ownKeys(obj)); // ['a', 'b', Symbol(c)]
遍历对象看似简单,真正容易出问题的是对“哪些键该出现”的预期不一致:有人以为 for...in 就是“所有键”,有人以为 Object.keys() 会包含 Symbol。实际选择哪个方法,取决于你是否关心原型、是否需要不可枚举属性、是否要处理 Symbol——这些细节在调试时往往卡很久。
标签:# javascript  # java  # 区别  # 字符串数组  
在线客服
服务热线

服务热线

4008888355

微信咨询
二维码
返回顶部
×二维码

截屏,微信识别二维码

打开微信

微信号已复制,请打开微信添加咨询详情!