JavaScript中二维数组调用includes()方法返回非预期结果问题咨询
异常结果的核心原理
JavaScript 对引用类型(数组、对象、函数等)的相等判断逻辑,默认仅比对内存引用地址,不会自动深度匹配内容值。
你的代码中执行逻辑具体为:
coords数组的每一项都是独立创建的数组实例,各自拥有独立的内存存储地址- 传给
includes()方法的参数[0,0],是代码执行时临时新建的独立数组实例,和coords中原本存储的第一个[0,0]元素的内存地址完全不同 - 即便两个数组的元素、结构完全一致,只要不是同一个内存引用,
includes()就会判定为不匹配,因此最终控制台输出false。
可以对照原始类型的匹配逻辑理解:如果是[1,2,3].includes(1)这类按原始值比对的场景,因为数字、字符串、布尔值等原始类型是直接按值判断,就会返回符合预期的true。
可行的解决方案
- 方案1:结合
some()逐值比对坐标(最适配当前坐标场景,性能最优)
因为坐标是固定双数字的规整结构,直接逐位比对数值即可,没有额外开销:const target = [0, 0]; const isMatch = coords.some(coord => coord[0] === target[0] && coord[1] === target[1] ); console.log(isMatch); // 输出预期的true - 方案2:抽离通用数组相等判断函数(适配更灵活的匹配需求)
如果后续需要匹配不同长度、不同结构的数组,可以封装通用的数组相等判断逻辑,复用性更强:// 一维数组相等判断,可按需扩展支持多层嵌套结构 function isArrayEqual(arr1, arr2) { if (arr1.length !== arr2.length) return false; return arr1.every((item, index) => item === arr2[index]); } // 调用匹配 const isMatch = coords.some(coord => isArrayEqual(coord, [0,0])); - 方案3:字符串转换简化匹配(仅适合纯数字规整结构)
对结构完全固定、不存在类型混合的纯数字坐标,可以通过转字符串的方式简化判断,需注意场景局限:
注意:这种写法存在边界问题,比如数组元素同时存在数字和字符串类型、元素本身包含逗号时,会出现误匹配,不建议在通用业务场景使用。const isMatch = coords.some(coord => coord.join(',') === [0,0].join(','));
内容的提问来源于stack exchange,提问作者Owen Moogk
相关产品推荐
相关产品推荐

