js比较两个数组是否相等

今天在看廖雪峰大神的博客意外地发现javascript是不能用 '=='或'==='操作符直接比较两个数组是否相等的。


先看案例:

var a = [1,2,3,4,5];
var b = a.slice();
console.log(a);          //  [1,2,3,4,5]
console.log(b);          //  [1,2,3,4,5]
console.log(a === b);    //  false
console.log(a == b);     //  false
console.log([] == []);   //  false
console.log( [] === []); //  false

为什么都输出false呢?先弄清楚以下几点:

  1. javascript包括两个不同类型的值:基本数据类型和引用数据类型。
  2. 基本数据类型指的是简单的数据段,引用数据类型指的是有多个值构成的对象。
  3. 常见的基本数据类型:Number、String 、Boolean、Null和Undefined。

    var a = 10;
    var b = a;
    b = 20;
    console.log(a);  //  10

    上面b获取的是a值的一份拷贝,虽然两个变量的值相等,但是两个变量保存了两个不同的基本数据类型值。b只是保存了a赋值的一个副本,所以,b的改变,对a没有影响。

  4. 引用类型数据:也就是对象类型Object type,比如:Object、Array、Function、Data等。javascript的引用数据类型是保存在堆内存中的对象。

讲到这里应该理解为什么输出的是false了:因为数组是兑现,==或===操作符只能比较两个对象是否是同一个实例,也就是是否是同一个对象引用。目前JavaScript没有内置的操作符判断对象的内容是否相同。

那么该如何去判断数组是否相等呢?

  1. 有一种做法是将数组转换成字符串:
    JSON.stringify(a1) === JSON.stringify(a2)

    a1.toString() === a2.toString();
    请不要使用这种方法!!!
    这种方法在某些情况下是可行的,当两个数组的元素顺序相同且元素都可以转换成字符串的情况下确实可行。
    这样的代码存有隐患,比如数字被转换成字符串,数字“1”和字符串“1”会被认为相等,可能造成调试困难,不推荐使用。
  2. 另外一种方法:
function equar(a, b) {
    // 判断数组的长度
    if (a.length !== b.length) {
        return false
    } else {
        // 循环遍历数组的值进行比较
        for (let i = 0; i < a.length; i++) {
            if (a[i] !== b[i]) {
                return false
            }
        }
        return true;
    }
}
var s = equar([1, '2', 3], [1, 2, 3]);
var t = equar([1, 2, 3], [1, 2, 3]);
console.log(s);  //  false
console.log(t);  //  true

上面说的是如何判断数组是否相等,下面说下如何判断数组元素相同(也就是没有顺序的相等)

直接上代码:

function compareArraySort(a1,a2){
    if ((!a1 && a2) || (a1 && ! a2)) return false;
    if (a1.length !== a2.length) return false;
        a1 = [].concat(a1);
        a2 = [].concat(a2);
        a1 = a1.sort();
        a2 = a2.sort();
    for (var i = 0, n = a1.length; i < n; i++) {
        if (a1[i] !== a2[i]) return false;
    }
    return true;
}

console.log(compareArraySort([1,2,3],[1,3,2])) // true

 

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值