为何内容相同的数组[a, b, c]用==、===判断不相等,如何实现相等判断
双数组内容完全一致却被判断为不等的核心原因
JavaScript中的数组属于引用类型,不属于可直接按值比较的原始类型(字符串、数字、布尔值、null、undefined等)。
使用==或===对比两个数组时,比较逻辑从一开始就不会遍历数组内部存储的元素内容做匹配,只会对比两个数组变量保存的内存引用地址:只要是独立创建的两个数组实例,哪怕书写的元素完全相同,也会在内存中分配两个独立的存储块,对应的引用地址必然不同,因此相等判断的结果永远为false。
可以通过简单代码直观验证这个逻辑:
const arr1 = ['a', 'b', 'c'] const arr2 = ['a', 'b', 'c'] const arr3 = arr1 // 将arr1的内存引用直接赋值给arr3 console.log(arr1 === arr2) // false,两个独立实例,存储地址不同 console.log(arr1 === arr3) // true,指向完全相同的内存地址
常见认知误区澄清:很多人以为
==支持隐式类型转换,会自动把数组转成字符串后比对内容。实际上==的隐式转换规则仅在对比双方类型不一致时触发;当==的对比两端都是引用类型(数组、普通对象、函数等)时,会直接跳过转换流程,依然按内存引用地址判断相等性,不存在自动比对内容的逻辑。
实现同内容数组相等判断的常用方案
根据不同的业务场景,可以选择对应的实现方式:
- 适用于纯原始值元素的简单场景
如果数组中仅存储字符串、数字、布尔值这类原始值,且元素顺序固定,可以直接将数组序列化后做对比:// 对比前需注意:数组不能包含undefined、函数、循环引用对象,否则序列化结果会失真 JSON.stringify(arr1) === JSON.stringify(arr2) - 适用于浅层级比对的通用场景
优先校验两个数组的长度是否一致,长度不同直接判定为不等,再逐索引位置校验元素是否严格相等,减少不必要的遍历:
注意:如果数组内嵌套了对象、数组这类引用类型元素,这个浅比对方法依然会因为对比引用地址返回false,需要搭配递归逻辑实现深度比对。function shallowArrayEqual(arrA, arrB) { // 先校验输入是否都是合法数组 if (!Array.isArray(arrA) || !Array.isArray(arrB)) return false // 长度不一致直接判定不等 if (arrA.length !== arrB.length) return false // 逐位置比对元素 for (let i = 0; i < arrA.length; i++) { if (arrA[i] !== arrB[i]) return false } return true } - 适用于复杂嵌套结构的场景
如果数组内存在多层嵌套、特殊值(比如NaN、-0)等边界情况,可以使用成熟工具库提供的内置深度相等判断方法,不需要手动处理各类异常场景。
内容的提问来源于stack exchange,提问作者Mathias
相关产品推荐
相关产品推荐

