JavaScript怎么比较两个数组是否相同?
在 JavaScript 中,直接比较两个数组是否相同(内容完全相同)需要特别处理,因为数组是引用类型,直接使用 ===
或 ==
会比较内存地址而非内容。以下是几种常用方法:
方法 1:JSON.stringify()
将数组转为字符串后比较(适用于简单数据类型且顺序一致的数组):
const arr1 = [1, 2, 3];
const arr2 = [1, 2, 3];
console.log(JSON.stringify(arr1) === JSON.stringify(arr2)); // true
局限性:
- 不适用于含对象、函数、
undefined
等复杂类型的数组。 - 顺序不同会返回
false
(例如[1, 2]
和[2, 1]
)。
方法 2:遍历比较
手动遍历数组,逐个比较元素(适用于所有类型):
function areArraysEqual(arr1, arr2) {
if (arr1.length !== arr2.length) return false;
for (let i = 0; i < arr1.length; i++) {
if (arr1[i] !== arr2[i]) return false;
}
return true;
}
console.log(areArraysEqual([1, 2], [1, 2])); // true
局限性:
- 若元素是对象或嵌套数组,需递归比较(见方法 3)。
方法 3:深度比较
递归比较所有元素(支持嵌套数组和对象):
function deepEqual(a, b) {
if (a === b) return true;
if (typeof a !== 'object' || typeof b !== 'object' || a === null || b === null) return false;
if (Array.isArray(a) && Array.isArray(b)) {
if (a.length !== b.length) return false;
for (let i = 0; i < a.length; i++) {
if (!deepEqual(a[i], b[i])) return false;
}
return true;
}
return false;
}
console.log(deepEqual([1, [2]], [1, [2]])); // true
方法 4:使用 every
和索引
结合 every
方法简化遍历:
const arr1 = [1, 2, 3];
const arr2 = [1, 2, 3];
const isEqual = arr1.length === arr2.length &&
arr1.every((value, index) => value === arr2[index]);
console.log(isEqual); // true
特殊情况处理
-
NaN 值:
const arr1 = [NaN]; const arr2 = [NaN]; const isEqual = arr1.length === arr2.length && arr1.every((v, i) => (Number.isNaN(v) && Number.isNaN(arr2[i])) || v === arr2[i]); console.log(isEqual); // true
-
顺序无关的比较:
若顺序不重要,但内容要一致,可先排序再比较:const arr1 = [2, 1]; const arr2 = [1, 2]; const isEqual = JSON.stringify(arr1.sort()) === JSON.stringify(arr2.sort()); console.log(isEqual); // true
推荐工具库
对于复杂场景,可以使用第三方库(如 Lodash)的 _.isEqual
:
const _ = require('lodash');
console.log(_.isEqual([1, { a: 2 }], [1, { a: 2 }])); // true
根据需求选择合适的方法!如果数组结构简单,直接用 JSON.stringify
或遍历;若涉及嵌套或对象,用深度比较或 Lodash。