object.values()仅返回enumerable为true的自有属性值,忽略原型链、不可枚举属性及非自有属性;字面量属性默认可枚举,defineproperty添加的属性默认不可枚举。

enumerable 属性直接决定 Object.values() 是否包含某个属性的值。它不是可选配置,而是 Object.values() 的筛选开关——只有 enumerable: true 的自有属性,其值才会出现在返回的数组中;其余一律忽略。
只收集 enumerable: true 的自有属性值
Object.values() 不会访问原型链上的属性,也不处理不可枚举属性。哪怕属性真实存在、能正常读取(如 obj.hidden),只要它的 enumerable 为 false,就不会被纳入结果。
- 字面量创建的属性默认
enumerable: true,所以常规对象的值基本都会被提取 - 用
Object.defineProperty()添加的属性,默认enumerable: false,必须显式设为true才会被Object.values()捕获 - 类实例的普通实例属性(如
this.name = 'Alice')属于可枚举自有属性,会被包含
和 for...in、JSON.stringify 行为一致
Object.values() 的枚举逻辑与 for...in 循环保持同步(但不继承),这意味着它遵循同一套可枚举性规则:
-
for...in遍历时跳过的属性,Object.values()也跳过 -
JSON.stringify()不序列化的属性,Object.values()同样不提取 - 但注意:
Object.getOwnPropertyNames()和Object.getOwnPropertyDescriptor()不受enumerable影响,它们能拿到所有自有属性
常见误判场景
容易以为“能访问就等于能遍历”,实际并非如此:
- 给对象添加了
Object.defineProperty(obj, 'cache', { value: {}, enumerable: false })→obj.cache可读,但Object.values(obj)里没有它 - 用
Object.create(null)创建的对象,即使手动定义属性,也要检查enumerable设置,否则值不会出现 - 从构造函数或 class 中生成的实例,方法通常不可枚举(函数属性默认
enumerable: false),所以不会出现在Object.values()结果中
如何确认某个属性是否被 Object.values() 包含
最直接的方式是结合 Object.keys() 和属性描述符检查:
- 先用
Object.keys(obj)看键是否存在——如果键不在里面,那它的值肯定不会被Object.values()返回 - 再用
Object.getOwnPropertyDescriptor(obj, key)查看enumerable字段是否为true - 或者用
obj.propertyIsEnumerable(key)快速判断(仅对自有可枚举属性返回true)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











