話說,說什麼呢,先看下題吧還是、
` 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;
}
複製程式碼
`