JavaScript进阶17笔记
这一章介绍由 key 值标记的数据容器;Map 和 Set 对象承载的数据元素可以按照插入时的顺序被迭代遍历。
映射
Map
对象
ECMAScript 2015 引入了一个新的数据结构来将一个值映射到另一个值。一个
下面的代码演示了使用Map
进行的一些基本操作。你可以使用
var sayings = new Map();
sayings.set('dog', 'woof');
sayings.set('cat', 'meow');
sayings.set('elephant', 'toot');
sayings.size; // 3
sayings.get('fox'); // undefined
sayings.has('bird'); // false
sayings.delete('dog');
sayings.has('dog'); // false
for (var [key, value] of sayings) {
console.log(key + ' goes ' + value);
}
// "cat goes meow"
// "elephant goes toot"
sayings.clear();
sayings.size; // 0
Object
和Map
的比较
一般地,
-
Object
的键均为String
类型,在Map
里键可以是任意类型。 -
必须手动计算
Object
的尺寸,但是可以很容易地获取使用Map
的尺寸。 -
Map
的遍历遵循元素的插入顺序。 -
Object
有原型,所以映射中有一些缺省的键。(可以用map = Object.create(null) 回避
)。
这三条提示可以帮你决定用Map
还是Object
:
-
如果键在运行时才能知道,或者所有的键类型相同,所有的值类型相同,那就使用
Map
。 -
如果需要将原始值存储为键,则使用
Map
,因为Object
将每个键视为字符串,不管它是一个数字值、布尔值还是任何其他原始值。 -
如果需要对个别元素进行操作,使用
Object
。
WeakMap
对象
与Map
对象不同的是,WeakMap
的键是不可枚举的。不提供列出其键的方法。列表是否存在取决于垃圾回收器的状态,是不可预知的。
WeakMap
对象的一个用例是存储一个对象的私有数据或隐藏实施细节。
对象内部的私有数据和方法被存储在WeakMap
类型的privates
变量中。所有暴露出的原型和情况都是公开的,而其他内容都是外界不可访问的,因为模块并未导出privates
对象。
const privates = new WeakMap();
function Public() {
const me = {
// Private data goes here
};
privates.set(this, me);
}
Public.prototype.method = function () {
const me = privates.get(this);
// Do stuff with private data in `me`...
};
module.exports = Public;
集合
Set
对象
这里演示了Set
的基本操作:
var mySet = new Set();
mySet.add(1);
mySet.add("some text");
mySet.add("foo");
mySet.has(1); // true
mySet.delete("foo");
mySet.size; // 2
for (let item of mySet) console.log(item);
// 1
// "some text"
数组和集合的转换
可以使用
Array.from(mySet);
[
Array
和Set
的对比
一般情况下,在 JavaScript 中使用数组来存储一组元素,而新的集合对象有这些优势:
-
数组中用于判断元素是否存在的
-
Set
对象允许根据值删除元素,而数组中必须使用基于下标的 splice 方法。 -
数组的
indexOf
方法无法找到 -
Set
对象存储不重复的值,所以不需要手动处理包含重复值的情况。
WeakSet
对象
与
-
WeakSets
中的值必须是对象类型,不可以是别的类型 -
WeakSet
的“weak”指的是,对集合中的对象,如果不存在其他引用,那么该对象将可被垃圾回收。于是不存在一个当前可用对象组成的列表,所以WeakSets
不可枚举
WeakSet
的用例很有限,比如使用 DOM 元素作为键来追踪它们而不必担心内存泄漏。
Map
的键和Set
的值的等值判断
Map
的键和Set
的值的等值判断都基于
-
判断使用与
===
相似的规则。 -
-0
和+0
相等。 -
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构