object.values返回对象自身可枚举属性的值数组,按定义顺序,不包含原型链、symbol、不可枚举属性及getter值;仅支持严格相等(===)比对,无法搜索嵌套值或模糊匹配。

Object.values 返回的是值数组,不是对象本身
调用 Object.values(obj) 会返回一个纯数组,包含对象自身可枚举属性的值(按属性定义顺序),不包括原型链上的属性。这意味着你可以直接把它交给 includes 处理,但要注意值的类型和相等性判断逻辑。
常见错误是误以为它能“搜索嵌套值”或“模糊匹配”——它只做严格相等(===)比对,null、undefined、0、false 等容易因隐式转换被误判。
- 如果目标值是引用类型(如对象、数组),
includes一定返回false,因为比较的是内存地址 - 字符串大小写敏感,
"Apple"不等于"apple" - 数字
42和字符串"42"不相等
检查单个值是否存在:最简写法
这是最常用场景:确认某个具体值是否出现在对象任意属性中。
const user = { name: "Alice", role: "admin", active: true };
const hasAdmin = Object.values(user).includes("admin"); // true
const hasFalse = Object.values(user).includes(false); // false(active 是 true)
const hasNull = Object.values(user).includes(null); // false(没这个值)
注意:Object.values 不会遍历 Symbol 属性或不可枚举属性,也不处理 getter —— 它只读取当前对象上 enumerable: true 的自有属性值。
检查多个候选值中的任意一个:用 some + includes 更安全
如果你要查的是“是否等于 A 或 B 或 C”,别嵌套 includes 多次,用 some 配合数组更清晰:
const config = { env: "prod", timeout: 5000, debug: false };
const validEnvs = ["dev", "staging", "prod"];
const isInValidEnv = validEnvs.some(env => Object.values(config).includes(env)); // true
这样做比手写三个 includes 或用 || 连接更易维护。但注意性能:每次 Object.values(config) 都会新建数组,高频调用时建议缓存结果。
- 如果
config很大且检查频繁,先存const vals = Object.values(config) - 如果要查的候选值很多(比如上百个),改用
Set提升查找效率:const validEnvSet = new Set(validEnvs); ... vals.some(v => validEnvSet.has(v))
深层值或条件匹配?Object.values 不适用
Object.values 只返回第一层属性值,遇到嵌套对象、数组就止步了。例如:
const data = { meta: { status: "ok" }, items: [1, 2] };
Object.values(data); // ["ok"], [[1, 2]] ← 注意:数组和对象原样返回,不会展开
此时 includes("ok") 成功,但 includes(1) 失败——因为 1 在 [1, 2] 里面,而外层数组里只有那个数组引用本身。
真要搜深层值,得用递归、JSON.stringify(仅限简单数据)、或专用工具如 Lodash 的 valuesIn + 自定义遍历。别硬套 Object.values。
容易被忽略的一点:当对象有大量属性或含长字符串时,Object.values 构建数组本身就有开销,而 includes 是线性扫描。没有索引,也没有短路优化——哪怕第一个值就匹配,它仍会完整生成整个值数组。










