object.values()对非对象参数先调用toobject()强制转换再提取可枚举属性值:字符串转string实例得字符数组,数字/布尔值转无自有可枚举属性的对象得空数组,null/undefined直接报错;数组则直接遍历索引属性。

Object.values() 会自动将非对象参数转为对应包装对象,再提取其可枚举属性值。这个过程不是“宽容处理”,而是有明确的强制转换规则,识别它关键看三步:类型判断 → 包装转换 → 属性遍历。
原始类型如何被包装成对象
当传入原始值时,JavaScript 内部调用 ToObject() 抽象操作:
-
字符串 → 转为
String实例,索引作为键:Object.values('ab')得['a', 'b'] -
数字 → 转为
Number实例,但该实例没有可枚举自有属性:Object.values(42)得[] -
布尔值 → 转为
Boolean实例,同样无自有可枚举属性:Object.values(true)得[] -
null / undefined → 不触发 ToObject,直接抛出
TypeError
数组输入的特殊表现
数组是对象,所以不触发包装转换,但它的“属性”就是数字索引:
-
Object.values([10, 20])等价于取obj[0]和obj[1]→[10, 20] - 稀疏数组中空位会被转为
undefined:Object.values([1,,3])→[1, undefined, 3] - 数组的 length、prototype 等不可枚举属性不会出现
Symbol 键与不可枚举属性的边界
Object.values() 只关心“自身 + 可枚举”,不因输入类型改变这一原则:
- 字符串转成的
String对象,其length属性默认不可枚举 → 不出现在结果中 - 手动定义的 Symbol 键,只要
enumerable: true,就会被包含:Object.values({[Symbol('s')]: 42})→[42] - 用
Object.defineProperty设置enumerable: false的属性,无论输入是什么类型,一律忽略
如何快速验证当前输入是否适用
不必死记规则,用这行代码现场检查最可靠:
console.log(Object.getOwnPropertyNames(Object(obj))); // 显示所有自有属性名(含不可枚举)console.log(Object.keys(Object(obj))); // 仅显示可枚举自有属性名console.log(Object.values(Object(obj))); // 最终实际取哪些值










