Set:
构造函数(可生成Set数据结构),类似数组,成员值唯一。
Set实例具有的属性:
1.Set.prototype.constructor:默认Set
2.Set.prototype.size:成员总数
Set实例的操作和遍历方法:
1.add(value):添加,返回Set结构
2.delete(value):删除,返回布尔值,表示是否删除成功
3.has(value):返回布尔值,表示是否为Set成员
4.clear():清除所有成员,无返回值
5.keys():返回键名
6.values():返回键值
7.entries():返回键值对
8.forEach():使用回调函数遍历每个成员
注意:
1.用于数组去重
1 | new Set(arr) |
2.向Set加入值时不会发生类型转换,比较时采用类似 === 的算法比较,区别在于Set中认为NaN等于自身(向Set中加入两个NaN时只能加入一个),=== 中认为NaN!==NaN
3.Set的遍历顺序是插入顺序,使用Set保存一个回调函数列表,调用时就能保证按照加入顺序调用
4.keys()和values()返回一致,因为Set只有键值(或者说键名和键值一样)
5.Set结构的实例默认可遍历,默认生成函数为values,可以直接用for···of···遍历
1 | Set.prototype[Symbole.iterator] === Set.prototype.values |
6.扩展运算符内部使用for···of循环,也可以用来遍历。扩展运算符和Set结构一起可以用作数组去重
eg1:
1 | let set = new Set(arr); |
eg2:
1 | let arr = [1,4,2,2,4,5,3]; |
7.使用Set实现并集、交集、差集
1 | let a = new Set([1, 2, 3]); |
Map:
JS对象,键值对集合(Hash结构)。
注意:
1.Map构造函数接受数组作为参数
2.Set和Map都可以用来生成新的Map
3.如果对同一个键多次赋值,后面的值将覆盖前面的值,如果读取一个未知的键值,返回undefined
1 | const map = new Map(); |
4.只有对同一个对象的引用,Map 结构才将其视为同一个键;同理,同样的值的两个实例,在Map结构中被视为两个键
1 | const map = new Map(); |
1 | const map = new Map(); |
Map的键实际上是跟内存地址绑定的,只要内存地址不一样,就视为两个键。这就解决了同名属性碰撞(crash)的问题
5.如果Map的键是一个简单类型的值(数字、字符串、布尔值),则只要两个值严格相等,Map将其视为一个键
1 | let map = new Map(); |
Map实例的属性
1.map.size:返回Map结构的成员总数
2.map.set:设置键名key对应的键值为value,返回Map结构,如果key值已存在,则value会被更新,否则生成该key
set方法返回的是当前的Map对象,因此可以采用链式写法
Map实例的操作和遍历方法
1.map.get:读取key对应的键值,找不到返回undefined
2.map.has:返回布尔值,表示某个键是否在当前Map对象之中
3.map.delete:删除某个键,成功返回true,失败返回false
4.map.clear:清除所有成员,无返回值
5.keys:返回键名
6.values:返回键值
7.entries:返回所有成员
8.forEach:遍历Map所有成员
1 | for (let [key, value] of map.entries()) { |
Map结构的默认遍历器接口为entries方法,即:1
map[Symbol.iterator] === map.entries
与其他数据结构的互相转换
1.Map转数组:(···new Map)
2.数组转MAp:new Map(arr)
3.Map转对象:如果所有 Map 的键都是字符串,它可以无损地转为对象。如果有非字符串的键名,那么这个键名会被转成字符串,再作为对象的键名。
1 | function strMapToObj(strMap) { |
4.对象转Map:
1 | function objToStrMap(obj) { |
5.Map转JSON:
Map 的键名都是字符串,这时可以选择转为对象 JSON。
1 | function strMapToJson(strMap) { |
Map 的键名有非字符串,这时可以选择转为数组 JSON。
1 | function mapToArrayJson(map) { |
6.JSON转Map:
JSON 转为 Map,正常情况下,所有键名都是字符串。
1 | function jsonToStrMap(jsonStr) { |
有一种特殊情况,整个 JSON 就是一个数组,且每个数组成员本身,又是一个有两个成员的数组。这时,它可以一一对应地转为 Map。这往往是 Map 转为数组 JSON 的逆操作。
1 | function jsonToMap(jsonStr) { |
1 | "use strict"; |