JavaScript如何比较两个数组的内容是否相同
JavaScript是不能用==或===操作符直接比较两个数组是否相等的。因为JavaScript里面Array是对象,==或===操作符只能比较两个对象是否是同一个实例,也就是是否是同一个对象引用。目前JavaScript没有内置的操作符判断对象的内容是否相同。
如果要比较数组是否相等,就只能遍历数组元素比较。网上流传的
JSON.stringify(a1) == JSON.stringify(a2)
或 a1.toString() == a2.toString()
或者常用函数
/**
*
* @desc 判断两个数组是否相等
* @param {Array} arr1
* @param {Array} arr2
* @return {Boolean}
*/
function arrayEqual(arr1, arr2) {
if (arr1.length != arr2.length) return false;
for (var i = 0; i < arr1.length; ++i) {
if (arr1[i] !== arr2[i]) return false;
}
return true;
}
这种方法在某些情况下是可行的,当两个数组的元素顺序相同且元素都可以转换成字符串的情况下确实可行,但是这样的代码存有隐患,比如数字被转换成字符串,数字“1”和字符串“1”会被认为相等,可能造成调试困难,不推荐使用。
在StackOverflow上有大神已经提供了正确的方法,我就做下搬运工吧:
// 如果重写现有方法,则发出警告
if(Array.prototype.equals)
Array.prototype.equals = function (array) {
// 如果另一个数组是false,则返回
if (!array)
return false;
// 比较长度-可以节省大量时间
if (this.length != array.length)
return false;
for (var i = 0, l = this.length; i < l; i++) {
// 检查是否有嵌套数组
if (this[i] instanceof Array && array[i] instanceof Array) {
// 递归到嵌套数组中
if (!this[i].equals(array[i]))
return false;
}
else if (this[i] != array[i]) {
// 警告-两个不同的对象实例永远不会相等:{x:20}!={x:20}
return false;
}
}
return true;
}
// 在循环中从中隐藏方法
Object.defineProperty(Array.prototype, "equals", {enumerable: false});