Map
Map 对象保存键值对,并且能够记住键的原始插入顺序。任何值(对象或者原始值) 都可以作为一个键或一个值。
描述
一个Map对象在迭代时会根据对象中元素的插入顺序来进行 — 一个 for...of 循环在每次迭代后会返回一个形式为[key,value]的数组。
键的相等(Key equality)
- 键的比较是基于
sameValueZero算法: NaN是与NaN相等的(虽然NaN !== NaN),剩下所有其它的值是根据===运算符的结果判断是否相等。- 在目前的ECMAScript规范中,
-0和+0被认为是相等的,尽管这在早期的草案中并不是这样。有关详细信息,请参阅浏览器兼容性 表中的“Value equality for -0 and 0”。
Objects 和 maps 的比较
Objects 和 Maps 类似的是,它们都允许你按键存取一个值、删除键、检测一个键是否绑定了值。因此(并且也没有其他内建的替代方式了)过去我们一直都把对象当成 Maps 使用。不过 Maps 和 Objects 有一些重要的区别,在下列情况里使用 Map 会是更好的选择:
| Map | Object | |
|---|---|---|
| 意外的键 | Map 默认情况不包含任何键。只包含显式插入的键。 |
一个 Object 有一个原型, 原型链上的键名有可能和你自己在对象上的设置的键名产生冲突。注意: 虽然 ES5 开始可以用 Object.create(null) 来创建一个没有原型的对象,但是这种用法不太常见。 |
| 键的类型 | 一个 Map的键可以是任意值,包括函数、对象或任意基本类型。 |
一个Object 的键必须是一个 String 或是Symbol。 |
| 键的顺序 | Map 中的 key 是有序的。因此,当迭代的时候,一个 Map 对象以插入的顺序返回键值。 |
一个 Object 的键是无序的注意:自ECMAScript 2015规范以来,对象确实保留了字符串和Symbol键的创建顺序; 因此,在只有字符串键的对象上进行迭代将按插入顺序产生键。 |
| Size | Map 的键值对个数可以轻易地通过size 属性获取 |
Object 的键值对个数只能手动计算 |
| 迭代 | Map 是 iterable 的,所以可以直接被迭代。 |
迭代一个Object需要以某种方式获取它的键然后才能迭代。 |
| 性能 | 在频繁增删键值对的场景下表现更好。 | 在频繁添加和删除键值对的场景下未作出优化。 |
构造函数
-
创建
Map对象
属性
-
Map.length属性 length 的值为 0 。 想要计算一个
Map中的条目数量, 使用Map.prototype.size. -
本构造函数用于创建派生对象。
-
表示
Map构造器的原型。 允许添加属性从而应用于所有的Map对象。
Map 实例
所有的 Map 对象实例都会继承 Map.prototype。
属性
-
Map.prototype.constructor返回一个函数,它创建了实例的原型。默认是
Map函数。 -
返回Map对象的键/值对的数量。
方法
-
移除Map对象的所有键/值对 。
-
如果
Map对象中存在该元素,则移除它并返回true;否则如果该元素不存在则返回*false*。随后调用Map.prototype.has(key)将返回false。 -
返回一个新的
Iterator对象,它按插入顺序包含了Map对象中每个元素的[key, value]**数组**。 -
Map.prototype.forEach(callbackFn[, thisArg\])按插入顺序,为
Map对象里的每一键值对调用一次callbackFn函数。如果为forEach提供了thisArg,它将在每次回调中作为this值。 -
返回键对应的值,如果不存在,则返回undefined。
-
返回一个布尔值,表示Map实例是否包含键对应的值。
-
返回一个新的
Iterator对象, 它按插入顺序包含了Map对象中每个元素的键 。 -
设置Map对象中键的值。返回该Map对象。
-
返回一个新的
Iterator对象,它按插入顺序包含了Map对象中每个元素的值 。 -
返回一个新的
Iterator对象,它按插入顺序包含了Map对象中每个元素的[key, value]**数组**。
Set
语法
new Set([iterable]);
参数
-
iterable
如果传递一个可迭代对象,它的所有元素将不重复地被添加到新的 Set中。如果不指定此参数或其值为
null,则新的 Set为空。
返回值
一个新的Set对象。
简述
Set对象是值的集合,你可以按照插入的顺序迭代它的元素。 Set中的元素只会出现一次,即 Set 中的元素是唯一的。
值的相等
因为 Set 中的值总是唯一的,所以需要判断两个值是否相等。在ECMAScript规范的早期版本中,这不是基于和===操作符中使用的算法相同的算法。具体来说,对于 Set s, +0 (+0 严格相等于-0)和-0是不同的值。然而,在 ECMAScript 2015规范中这点已被更改。有关详细信息,请参阅浏览器兼容性 表中的“Key equality for -0 and 0”。
另外,NaN和undefined都可以被存储在Set 中, NaN之间被视为相同的值(NaN被认为是相同的,尽管 NaN !== NaN)。
属性
-
Set.sizesize属性的默认值为0。
-
构造函数用来创建派生对象.
-
表示
Set构造器的原型,允许向所有Set对象添加新的属性。
Set实例
所有Set实例继承自 Set.prototype。
属性
-
Set.prototype.constructor返回实例的构造函数。默认情况下是
Set。 -
返回
Set对象的值的个数。
方法
-
在
Set对象尾部添加一个元素。返回该Set对象。 -
移除
Set对象内的所有元素。 -
移除
Set的中与这个值相等的元素,返回Set.prototype.has(value)在这个操作前会返回的值(即如果该元素存在,返回true,否则返回false)。Set.prototype.has(value)在此后会返回false。 -
返回一个新的迭代器对象,该对象包含
Set对象中的按插入顺序排列的所有元素的值的[value, value]数组。为了使这个方法和Map对象保持相似, 每个值的键和值相等。 -
Set.prototype.forEach(callbackFn[, thisArg\])按照插入顺序,为Set对象中的每一个值调用一次callBackFn。如果提供了
thisArg参数,回调中的this会是这个参数。 -
返回一个布尔值,表示该值在
Set中存在与否。 -
与**
values()**方法相同,返回一个新的迭代器对象,该对象包含Set对象中的按插入顺序排列的所有元素的值。 -
返回一个新的迭代器对象,该对象包含
Set对象中的按插入顺序排列的所有元素的值。 -
返回一个新的迭代器对象,该对象包含
Set对象中的按插入顺序排列的所有元素的值。