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() 的关键区别。不加防护直接用,很容易误读到 toString、hasOwnProperty 等继承方法。
- 务必用
obj.hasOwnProperty(key)判断是否为自有属性 - 不能用于
Map、Set等内置集合类型(它们没有可枚举属性) - 若对象被冻结(
Object.freeze())或属性设为不可枚举,for...in仍会跳过
Object.entries() 适合需要同时处理键和值的场景
Object.entries(obj) 返回二维数组,如 [ ['a', 1], ['b', 2] ],天然适配 for...of 或 Array.prototype.map() 等数组方法。
本文档主要讲述的是j2me3D游戏开发简单教程; 如今,3D图形几乎是任何一部游戏的关键部分,甚至一些应用程序也通过用3D形式来描述信息而获得了成功。如前文中所述,以立即模式和手工编码建立所有的3D对象的方式进行开发速度很慢且很复杂。应用程序中多边形的所有角点必须在数组中独立编码。在JSR 184中,这称为立即模式。希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看
- 比分别调用
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——这些细节在调试时往往卡很久。










