JS

梗概

  • 在 JavaScript 中,Set集合Map 判断对象相同的方式依赖于对象的引用而不是对象的内容。
    • 因此,即使两个对象有相同的属性和值,JavaScript 仍然会将它们视为不同的对象,除非它们的引用是相同的。
    • 如果你想判断对象的内容是否相同,你需要手动比较对象的属性和值。像 lodash 这样的库提供了深度比较的方法(如 _.isEqual),你也可以手动编写一个递归比较函数。或用[use::JSON.stringify]来对比

具体说明

  • 引用相同:当两个对象的引用是同一个对象时,SetMap 会将它们视为相同。
  • 引用不同:即使对象的内容完全相同,如果它们的引用不同,SetMap 会将它们视为不同的对象。

示例

const obj1 = { a: 1 };
const obj2 = { a: 1 };
const obj3 = obj1;
const mySet = new Set();
mySet.add(obj1);
mySet.add(obj2);
mySet.add(obj3);
console.log(mySet.size); // 输出 2,因为 obj1 和 obj3 是同一个引用,而 obj2 是不同的引用
const myMap = new Map();
myMap.set(obj1, 'Object 1');
myMap.set(obj2, 'Object 2');
myMap.set(obj3, 'Object 3');
console.log(myMap.size); // 输出 2,同样的原因,obj1 和 obj3 是同一个引用
console.log(myMap.get(obj1)); // 输出 'Object 3',因为 obj1 和 obj3 是同一个对象