在JavaScript中,判斷兩個物件是否相等有多種方法,取決于你對 相等 的定義以及物件屬性的型別,以下是幾種常見的方法:
1. 嚴格相等運算子 (===)
使用 === 運算子可以比較兩個物件是否參考同一個物件,如果兩個變數參考了同一個物件,則它們是相等的,否則它們是不相等的,例如:
const obj1 = { a: 1 };
const obj2 = { a: 1 };
const obj3 = obj1;
console.log(obj1 === obj2); // false
console.log(obj1 === obj3); // true
在上面的例子中, obj1 和 obj2 的屬性值相同,但它們是不同的物件,因此它們的 === 比較回傳 false ,而 obj1 和 obj3 參考了同一個物件,它們是相等的,因此 obj1 === obj3 回傳 true ,
這里就是嚴格比較,參考地址和屬性名屬性值都要一一對應,
2. 物件屬性的比較
如果你只是需要比較兩個物件的屬性是否相等(不比較參考地址),你可以使用回圈或 Object.keys 方法來獲取物件屬性的串列,并比較它們的值,例如:
function isObjectEqual(obj1, obj2) { const obj1Keys = Object.keys(obj1); const obj2Keys = Object.keys(obj2); if (obj1Keys.length !== obj2Keys.length) { return false; } for (let key of obj1Keys) { if (obj1[key] !== obj2[key]) { return false; } } return true; } const obj1 = { a: 1, b: "hello" }; const obj2 = { a: 1, b: "world" }; const obj3 = { a: 1, b: "hello" }; console.log(isObjectEqual(obj1, obj2)); // false console.log(isObjectEqual(obj1, obj3)); // true
在上面的例子中, isObjectEqual 函式比較了 obj1 和 obj2 的屬性值并回傳 false ,因為它們的 b 屬性的值不相等,而 isObjectEqual(obj1, obj3) 回傳 true ,因為它們的所有屬性值都相等,
3. 使用 Lodash 等工具庫判斷兩個物件是否相等
可以使用 Lodash 的 isEqual 方法(依然不比較參考地址), isEqual 方法會遞回比較兩個物件的屬性值是否相等,包括嵌套物件和陣列,
const obj1 = { a: 1, b: { c: 2 } };
const obj2 = { a: 1, b: { c: 2 } };
const obj3 = { a: 1, b: { c: 3 } };
console.log(_.isEqual(obj1, obj2)); // true
console.log(_.isEqual(obj1, obj3)); // false
在上面的例子中, _.isEqual(obj1, obj2) 回傳 true ,因為它們的所有屬性值都相等,包括嵌套的物件,而 _.isEqual(obj1, obj3) 回傳 false ,因為它們的 b.c 屬性的值不相等,
4. JSON.stringify 方法
如果你的物件中只包含簡單型別(如數字、字串、布林值和 null)以及其他物件或陣列,則可以使用 JSON.stringify 方法將物件轉換為字串,然后比較這些字串(還是不比較參考地址),例如:
const obj1 = { a: 1, b: "hello", c: true };
const obj2 = { a: 1, b: "hello", c: true };
const obj3 = { a: 1, b: "world", c: true };
console.log(JSON.stringify(obj1) === JSON.stringify(obj2)); // true
console.log(JSON.stringify(obj1) === JSON.stringify(obj3)); // false
在上面的例子中, JSON.stringify(obj1) 和 JSON.stringify(obj2) 都回傳相同的字串,因此它們的比較回傳 true ,而 JSON.stringify(obj1) 和 JSON.stringify(obj3) 回傳不同的字串,因此比較回傳 false ,
需要注意的是,這種方法只適用于簡單型別和嵌套物件或陣列,因為它無法處理物件中包含函式、正則運算式和 Date 等型別的情況,
5. 使用 Object.is() 方法
它與 === 運算子類似,但是有一些特殊情況,例如 Object.is(+0, -0) 回傳 false ,而 === 運算子回傳 true ,
const obj1 = { a: 1 };
const obj2 = { a: 1 };
const obj3 = obj1;
console.log(Object.is(obj1, obj2)); // false
console.log(Object.is(obj1, obj3)); // true
在上面的例子中, Object.is(obj1, obj2) 回傳 false ,因為 obj1 和 obj2 是兩個不同的物件,而 Object.is(obj1, obj3) 回傳 true ,因為 obj1 和 obj3 參考了同一個物件,
無論你使用哪種方法,都需要明確你對 相等 的定義以及物件屬性的型別,并選擇適合你需求的方法,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/551960.html
標籤:其他
下一篇:返回列表
