随着程序需要处理的数据越来越多,结构越来越复杂,单一的存储形式不足以存储复杂的结构。
我们使用数组和对象来搭配,存储复杂的结构。
但是数组和对象本身很重(除了存储数据之外,还有非常多的属性、方法、继承关系.......)。
es6新增了两个数据结构,专门用来存储数据,结构很轻,处理数据速度很快。
但是,set、map太新,很多传统的传输数据的方式都暂不支持,因此,目前set和map仅仅用于前端本地数据处理。
set
set结构是es6新增的数据类型,类似数组,但是成员不能重复。
set结构是唯一性可以用来判断NaN。
set结构简单,遍历速度非常快。
let s = new Set();
在定义时,可以接受任何遍历器接口的数据:
let s = new Set([1,2,3,4,5]);
let s = new Set('abcdef');
set结构的属性:
.size 可以返回set结构的长度
set结构的方法:
add(value) 新增
delete(value) 移除
has(value) 判断是否包含
clear() 清除数据
set结构的遍历器
keys()
values()
entries()
forEach()
我们可以使用for of循环遍历es6的遍历器接口:
for (let item of set) {
console.log(item)
}
直接遍历set,默认是遍历set.keys()接口。对于set结构,其key和value是相同的,所以keys和values也是相同的。
for (let item of set.keys()) {
console.log(item)
}
for (let item of set.values()) {
console.log(item)
}
entries接口提供复合结构:
for (let item of set.entries()) {
console.log(item)//[key,value]
}
s.forEach(function (key, value, set) {
console.log(a, b, c);//1,1,set
})
forEach回调函数的参数:因为set结构没有key,所以,访问key实际上返回的是value。
set结构也可以用来做数组去重复:
let arr = [1,2,3,4,5,3,4,5];
let arr2 = [...new Set(arr)];
map
map结构是es6新增的用于替代对象存储数据的格式,它结构类似于对象,
但区别是,map结构的key不仅仅是字符串,还可以是其他格式,例如:对象。
//可以使用二维数组来初始化一个map结构。
let m = new Map([['a',1],['b',2]]);
map结构的属性:
size 返回map结构的长度。
map结构的方法:
set(key,value)
get(key)
has(key)
delete(key)
clear()
map结构的遍历器方法:
keys()
values()
entries()
forEach()
map.forEach(function (value, key, m) {
console.log(m);
})
set和map结构是es6新增的结构,用于存储和遍历大量数据,性能非常优异。但因为是es6新增的类型,所以,和es5的有些方法不兼容,使用要注意。
set和map都认为,NaN是相同的
什么情况下使用set和map结构:
1、数据量比较大时。
2、当我们需要数组成员不重复时,可以使用set替代数组。
3、当我们需要为程序中的一些对象存储数据时,可以使用map。
const h1 = document.querySelector('h1'); const map = new Map(); map.set(h1, { a: 1, b: 2 }); const data = map.get(h1); data.c = 3; console.log(map.get(h1))