JavaScript比較兩個數組的內容是否相同

今天在看廖雪峯大神的博客意外地發現javascript是不能用 '=='或'==='操做符直接比較兩個數組是否相等的。javascript


先看案例:java

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沒有內置的操做符判斷對象的內容是否相同。code

那麼該如何去判斷數組是否相等呢?

  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

以上就是個人總結,有不對的地方請指出。對象

相關文章
相關標籤/搜索