返回

JS 高效判断任意两个值是否相等,深入剖析数组与对象的深度对比

前端

  1. 严格相等与宽松相等

在 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