JavaScript 中的 Map
是一种键值对的集合,它允许使用任意类型的值作为键。这与普通的对象不同,因为对象的键只能是字符串或符号。Map
的一个重要特性是它保持了插入顺序,这意味着当你遍历 Map
时,键值对的顺序将与它们被插入的顺序一致。
哈希码(Hash Code):
哈希码是一个数值,通常用于快速查找和数据存储。在 JavaScript 中,当使用对象作为 Map
的键时,对象的哈希码是由其内存地址决定的。这意味着即使两个对象的内容完全相同,它们也会被视为不同的键,因为它们在内存中的位置不同。
Map
允许使用任何类型的值作为键,包括函数、对象和基本类型。Map
会记住键值对的插入顺序。Map
内部使用哈希表实现,因此查找、添加和删除操作的时间复杂度接近 O(1)。Map
可以快速存储和检索数据。Map
的唯一性来去除重复项。问题:为什么两个内容相同的对象作为 Map
的键时,它们被视为不同的键?
原因: 这是因为对象的哈希码是基于它们的内存地址计算的。即使两个对象的内容相同,它们在内存中的位置也不同,因此它们的哈希码也不同。
解决方法: 如果你需要根据对象的内容而不是内存地址来区分键,你可以自定义一个哈希函数来生成基于内容的哈希码。
function getObjectHashCode(obj) {
let str = JSON.stringify(obj);
let hash = 0;
if (str.length === 0) return hash;
for (let i = 0; i < str.length; i++) {
const char = str.charCodeAt(i);
hash = ((hash << 5) - hash) + char;
hash = hash & hash; // Convert to 32bit integer
}
return hash;
}
const map = new Map();
const obj1 = { name: "Alice", age: 25 };
const obj2 = { name: "Alice", age: 25 };
map.set(obj1, "Data for Alice");
map.set(obj2, "Duplicate Data");
// 使用自定义哈希函数来检查键是否相等
const hash1 = getObjectHashCode(obj1);
const hash2 = getObjectHashCode(obj2);
console.log(hash1 === hash2); // 输出: true
在这个例子中,getObjectHashCode
函数会根据对象的内容生成一个哈希码。这样,即使两个对象在内存中的位置不同,只要它们的内容相同,它们的哈希码也会相同。
领取专属 10元无门槛券
手把手带您无忧上云