JavaScript Fundamentals

JavaScript哈希表:对象与Map对象

Spread the love

JavaScript哈希映射:对象与Map对象

JavaScript不像其他一些语言那样直接拥有“HashMap”等价物。但是,我们可以使用两种主要方法实现类似的功能:普通的JavaScript对象和内置的Map对象。本文探讨了这两种方法,比较了它们的优缺点,以帮助您根据需要选择最佳方法。

目录

使用对象作为哈希映射

JavaScript对象可以充当简单的哈希映射。它们使用字符串键来访问关联的值。这种方法很简单,但也有局限性。

示例:


const myHashMap = {}; // 创建一个空对象

// 插入键值对
myHashMap.apple = 1;
myHashMap.banana = 2;
myHashMap.cherry = 3;

// 访问值
console.log(myHashMap.banana); // 输出:2

// 检查键是否存在
console.log('apple' in myHashMap); // 输出:true

// 删除键值对
delete myHashMap.banana;

// 迭代键值对(注意:顺序不保证)
for (const key in myHashMap) {
  console.log(key, myHashMap[key]);
}

优点:

  • 对于JavaScript开发人员来说简单且熟悉。
  • 没有外部依赖。

缺点:

  • 键限于字符串(或隐式转换为字符串的值)。
  • 没有内置的大小属性;您需要手动跟踪大小。
  • 缺少内置方法,例如getsethas等。
  • 键的顺序不保证。

使用Map对象

Map对象(在ES6中引入)提供了一个更强大的解决方案。它支持任何数据类型作为键,避免类型强制问题,并提供内置方法以实现高效操作。

示例:


const myMap = new Map();

// 插入键值对
myMap.set("apple", 1);
myMap.set(123, "number"); // 数字作为键
myMap.set({ a: 1 }, "object"); // 对象作为键

// 访问值
console.log(myMap.get("apple")); // 输出:1
console.log(myMap.get(123));     // 输出:"number"

// 检查键是否存在
console.log(myMap.has("apple")); // 输出:true

// 删除键值对
myMap.delete("apple");

// 获取大小
console.log(myMap.size); // 输出:2

// 迭代键值对(顺序保持)
for (const [key, value] of myMap) {
  console.log(key, value);
}

优点:

  • 支持任何数据类型作为键。
  • 提供内置方法(setgethasdeletesize)。
  • 使用for...of循环进行高效迭代。
  • 保留插入顺序。

缺点:

  • 需要ES6兼容性(尽管可以使用polyfill)。

结论

虽然普通的JavaScript对象足以满足简单的哈希映射式行为,但Map对象通常因其卓越的功能和效率而被推荐。除非您受到浏览器兼容性的严重限制,否则Map是大多数现代JavaScript项目的首选。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注