JS 高效判断任意两个值是否相等,深入剖析数组与对象的深度对比
2024-01-18 02:34:50
- 严格相等与宽松相等
在 JavaScript 中,比较两个值是否相等有两种运算符:严格相等运算符 ===
和宽松相等运算符 ==
。
-
严格相等运算符
===
:严格相等运算符比较两个值是否在值和类型上都相等。这意味着,如果两个值不仅值相同,而且类型也相同,它们才被认为是相等的。例如,1 === 1
为 true,因为两个值在值和类型上都相同,都是数字 1。而1 === "1"
为 false,因为虽然两个值相等,但类型不同,一个是数字,另一个是字符串。 -
宽松相等运算符
==
:宽松相等运算符比较两个值是否在值上相等,而不管它们的类型是否相同。这意味着,只要两个值相等,无论它们的类型是什么,它们都被认为是相等的。例如,1 == 1
为 true,1 == "1"
也为 true,因为两个值在值上相等。
2. 数组的比较
数组的比较在 JavaScript 中是一个常见的操作。我们可以使用严格相等运算符 ===
来比较两个数组是否相等。然而,需要注意的是,严格相等运算符只比较两个数组是否引用同一个对象。如果两个数组包含相同的元素,但引用不同的对象,则它们被认为不相等。
例如:
const arr1 = [1, 2, 3];
const arr2 = [1, 2, 3];
console.log(arr1 === arr2); // false
为了比较两个数组是否包含相同的元素,我们需要使用更深入的比较方法。一种方法是使用 Array.prototype.every()
方法。该方法接受一个回调函数,该函数对数组中的每个元素执行比较操作。如果回调函数对数组中的每个元素都返回 true,则两个数组被认为是相等的。
例如:
const arr1 = [1, 2, 3];
const arr2 = [1, 2, 3];
const isEqual = arr1.every((element, index) => element === arr2[index]);
console.log(isEqual); // true
3. 对象的比较
对象的比较在 JavaScript 中也是一个常见的操作。与数组类似,我们可以使用严格相等运算符 ===
来比较两个对象是否相等。然而,需要注意的是,严格相等运算符只比较两个对象是否引用同一个对象。如果两个对象具有相同的属性和值,但引用不同的对象,则它们被认为不相等。
例如:
const obj1 = {
name: 'John Doe',
age: 30
};
const obj2 = {
name: 'John Doe',
age: 30
};
console.log(obj1 === obj2); // false
为了比较两个对象是否具有相同的属性和值,我们需要使用更深入的比较方法。一种方法是使用 Object.keys()
方法和 Array.prototype.every()
方法。我们可以先使用 Object.keys()
方法获取两个对象的属性名,然后使用 Array.prototype.every()
方法比较两个对象是否具有相同的属性名和属性值。
例如:
const obj1 = {
name: 'John Doe',
age: 30
};
const obj2 = {
name: 'John Doe',
age: 30
};
const keys1 = Object.keys(obj1);
const keys2 = Object.keys(obj2);
const isEqual = keys1.every((key) => obj1[key] === obj2[key]);
console.log(isEqual); // true