toFrankie / blog

种一棵树,最好的时间是十年前。其次,是现在。
20 stars 1 forks source link

细读 ES6 | Map、Set #319

Open toFrankie opened 1 year ago

toFrankie commented 1 year ago

在日常开发中,使用 MapSet 的场景有哪些?

Map

简介

Map 是 ES6 中新增的一种引用数据类型。

Object.prototype.toString.call(new Map()) // "[object Map]"

常与 Object 作比较,主要区别如下:

Map Object
默认键 无。 Object.create(null) 创建的对象之外,一般都有默认键,比如 __proto__ 等与原型相关的键。
键的类型 可以是任意数据类型的值。 只能是 StringSymbol 类型的值。
键的顺序 有序(按插入顺序)。 无序。
是否可迭代 支持,其实例对象是一个可迭代对象。 不支持。

既然它是一个可迭代对象,自然就很方便地被解构、扩展运算符、for...ofArray.from() 等消费。

new Map()[Symbol.iterator] // ƒ entries() { [native code] }

构造函数

其构造函数可接受一个可迭代对象作为参数,可选。

new Map([iterable])

通常是 [[key, value], ...] 形式。比如:

const map = new Map([
  [1, 'one'],
  [2, 'two'],
  [3, 'three'],
])

也可使用链式形式插入键值。

const map = new Map()
  .set(1, 'one')
  .set(2, 'two')
  .set(3, 'three')

实例属性、方法

它只提供了两个实例属性。

Map.prototype.size

只读,返回实例对象的键值对数量。对比 ObjectObject.keys(obj).length,它方便太多了。

另一个 @@species 属性太太太少见了,有兴趣自行翻阅。

它提供了一系列的实例方法,便于对其进行增删改查等操作。

Map.prototype.get()
Map.prototype.set()
Map.prototype.has()
Map.prototype.delete()
Map.prototype.clear()
  • clear() 之外,以上其他方法接受一个参数 key,可以是任意类型的值(原始值或引用值)。
  • get(key) 用于获取指定健的值,若 key 不存在于实例对象,则返回 undefined
  • set(key) 用于添加或更新指定健,并返回实例对象,因而可以链式调用。
  • has(key) 用于判断指定健是否存在,返回布尔值。
  • delete(key) 用于删除指定健,若健存在且已被删除,则返回 true,否则返回 false
  • clear() 用于清空实例对象中所有元素。
Map.prototype.keys()
Map.prototype.values()
Map.prototype.entries()
  • 作用与 Object.keys()Object.values()Object.entries() 类似,但不同。
  • 它们三个都返回一个新的迭代器对象(不是 Map 对象,也不是数组),其顺序同原始 Map 对象元素插入的顺序。
Map.prototype.forEach()

有且仅有这一个用于遍历的实例方法。别一上来就联想到 Array.prototype.forEach(),虽然都是遍历,但不同,它没有 map()filter() 等方法。

未完待续...