Array.prototype.includes无法直接处理多元条件,因其底层使用SameValueZero比较,对对象等引用类型只比地址而非内容;应改用some配合自定义逻辑,或提取唯一键后使用includes。

Array.prototype.includes 本身只支持单一值的浅层相等判断,不能直接用于“多元条件”(比如对象的多个属性同时匹配、或满足某种组合逻辑)的精准判断。它底层用的是 SameValueZero 比较,对对象、数组等引用类型,比的是引用地址,不是结构或内容。
为什么 includes 无法直接处理多元条件
例如:
const list = [{ id: 1, name: 'Alice' }, { id: 2, name: 'Bob' }];
console.log(list.includes({ id: 1, name: 'Alice' })); // false —— 新建对象,引用不同
即使内容完全一样,两个对象也是不同引用,includes 返回 false。
替代方案:用 some + 自定义条件判断
真正适合多元条件的,是 Array.prototype.some(),它允许你写任意逻辑:
立即学习“Java免费学习笔记(深入)”;
- 检查是否存在 id 为 1 且 name 为 'Alice' 的对象
- 检查是否同时满足 status === 'active' 且 role.includes('admin')
- 支持嵌套属性、函数计算、正则匹配等复杂逻辑
示例:
const users = [
{ id: 1, name: 'Alice', role: 'admin' },
{ id: 2, name: 'Bob', role: 'user' }
];
const hasAdminAlice = users.some(u =>
u.id === 1 && u.name === 'Alice' && u.role === 'admin'
); // true
const hasActiveAdmin = users.some(u =>
u.role === 'admin' && ['active', 'pending'].includes(u.status)
); // false(因为没设 status)
如果坚持用 includes:先提取关键字段再判断
适用于“多元条件可归约为一个唯一标识”的场景,比如把对象转成字符串键或复合键:
- 生成唯一 key:如
`${id}-${name}`或JSON.stringify({id,name})(注意顺序和类型一致) - 预先构建 keys 数组,再用 includes 查找
示例:
const userKeys = users.map(u => `${u.id}-${u.name}`); // ['1-Alice', '2-Bob']
console.log(userKeys.includes('1-Alice')); // true
// 或用 JSON(仅限简单、确定结构的对象)
const jsonKeys = users.map(u => JSON.stringify({ id: u.id, name: u.name }));
console.log(jsonKeys.includes(JSON.stringify({ id: 1, name: 'Alice' }))); // true
⚠️ 注意:JSON.stringify 对函数、undefined、Symbol、循环引用会丢失或报错,不推荐用于不确定结构的数据。
进阶技巧:封装成可复用的工具函数
把常见多元条件抽象出来,提高可读性和复用性:
const hasUser = (list, { id, name, role }) =>
list.some(u =>
(id === undefined || u.id === id) &&
(name === undefined || u.name === name) &&
(role === undefined || u.role === role)
);
hasUser(users, { id: 1, name: 'Alice' }); // true
hasUser(users, { role: 'admin' }); // true
不复杂但容易忽略:多元条件的本质是逻辑判断,不是成员查找。选对方法比硬套 includes 更重要。


















