一道Js判斷物件是否相等面試題引發的故事

前端晉級攻城獅發表於2019-06-17

話說,說什麼呢,先看下題吧還是、

` function checkName(data) {

if (data === { name: 'LIMING' }) {

console.log("one");
複製程式碼

} else if (data == { name: 'LIMING' }) {

console.log(two");
複製程式碼

} else {

console.log("three");
複製程式碼

}

}

checkName({ name: 'LIMING' }); ` so,問題來了,問上面js程式碼執行以後輸出什麼?

機智的你想到了沒?

one?two?three?

知道答案前要知道我們先思考下這道題考察的是什麼知識點,工欲善其事必先利其器,自然就脫口而出了、

很明顯題目是在考面試人員如何判斷JS物件相等或者判斷物件相等的方法。

在比較相等性,原始型別通過它們的值進行比較,而物件通過它們的引用進行比較。JavaScript檢查物件是否具有對記憶體中相同位置的引用。

所以推薦使用遞迴的方法:

先判斷倆者是不是物件;

是物件後倆者長度是否一致;

判斷倆個物件的所有key值是否相等相同;

判斷倆個物件的相應的key對應的值是否相同;

來一個遞迴判斷裡面的物件迴圈1-4步驟 ` function diff(obj1,obj2){

    var o1 = obj1 instanceof Object;
    
    var o2 = obj2 instanceof Object;
    
    // 判斷是不是物件
    
    if (!o1 || !o2) {
    
        return obj1 === obj2;
        
    }

    //Object.keys() 返回一個由物件的自身可列舉屬性(key值)組成的陣列,
    
    //例如:陣列返回下表:let arr = ["a", "b", "c"];console.log(Object.keys(arr))->0,1,2;
    
    if (Object.keys(obj1).length !== Object.keys(obj2).length) {
    
        return false;
    }

    for (var o in obj1) {
        var t1 = obj1[o] instanceof Object;
        var t2 = obj2[o] instanceof Object;
        if (t1 && t2) {
            return diff(obj1[o], obj2[o]);
        } else if (obj1[o] !== obj2[o]) {
            return false;
        }
    }
    return true;
}
複製程式碼

`

相關文章