Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

细读 ES6 | Map、Set #319

Open
toFrankie opened this issue Jul 23, 2023 · 0 comments
Open

细读 ES6 | Map、Set #319

toFrankie opened this issue Jul 23, 2023 · 0 comments
Labels
2023 2023 年撰写 JS 与 JavaScript、ECMAScript 相关的文章

Comments

@toFrankie
Copy link
Owner

toFrankie commented Jul 23, 2023

在日常开发中,使用 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() 等方法。

未完待续...

@toFrankie toFrankie added JS 与 JavaScript、ECMAScript 相关的文章 2023 2023 年撰写 labels Jul 23, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
2023 2023 年撰写 JS 与 JavaScript、ECMAScript 相关的文章
Projects
None yet
Development

No branches or pull requests

1 participant