Set
类似于数组,其成员是唯一的,没有重复的值;
//接收一个数组作为参数,用于初始化
var temp = new Set([1,2,3,2]);
//不会添加重复的值
temp.size //3
//使用add()添加元素
temp.add(4);
向Set中添加值不会发生类型转换(严格相等===),3和“3”是不同的值;两个对象总不相等;例外NaN等于自身,但基本运算中NaN!=NaN&NaN!==NaN
Set结构属性、方法
add() //添加值,返回添加后的Set结构
delete() //删除值,返回布尔值,是否删除成功
has() //是否存在,布尔值
clear() //清除所有成员
Array.from() 可以将Set结构转为数组,利用特性可用于数组去重。简写:[…temp],使用扩展运算符…转换为数组。
遍历操作:
keys() //键名
values() //键值 **为Set 结构的遍历接口,可省略调用方法
entries() //键值对
forEach() //遍历每个成员
let set = new Set(['red','green','blue']);
for(let item of set.keys()){
console.log(item);
}
for(let item of set.values()){
console.log(item);
} // "red" "green" "blue"
for(let item of set.entries()){
console.log(item);
} //["red","red"] ["green","green"] ["blue","blue"]
Set结构没有键名,keys()返回的结果和values()一样;在进行遍历时可省略方法
for(let item of temp){
console.log(item);
}
使用Set结构实现并集、交集、差集
let t = new Set([1,2,3]);
let p = new Set([2,4,5]);
//并集
let union = new Set([...t,...p]);
[...union] //[1,2,3,4,5]
//交集
let intersect = new Set([...t].filter(item=>p.has(item)));
[...intersect] //[2]
//差集
let difference = new Set([...t].filter(item=>!p.has(item)));
[...difference] //[1,3]
在遍历时对数据进行某种操作,再同步到数据结构中:
//1.数据处理完返回的数据再new 一个Set结构赋值给原来的结构
let set = new Set([1,2,3]);
set = new Set([...set].map(item=>item+1));
//2.使用Array.from(),转换为数组后,第二个参数进行数据处理,返回新的数组
set = new Set(Array.from(set,item=>item+1));
WeakSet
可用于存储DOM对象。
与Set不同之处
1.成员都是对象,不能使其他类型的值
2.对象都是弱引用,无法引用;不可遍历
WeakSet的属性、方法
**没有size属性、不能遍历
add() //添加
delete() //删除
has() //是否存在
**不用考虑成员对象实例是否删除,不会造成内存泄漏
Map
类似于对象、键值对集合;键的类型不局限于字符串,可以是任意类型。
1.接收数组作为构造函数的参数,数组成员表示键值对的数组。
let items=[["name","123"],["age","34"]];
let map = new Map(items);
//内部操作
/**
let map = new Map();
items.forEach((key,value)=>map.set(key,value));
**/
//获取值
map.get("name") //"123"
//赋值
map.set("name","小李");
1.对相同的键赋值会覆盖之前的值
2.只有对同一个对象的引用才视为同一个键;同样两个值相同的实例视为两个键
3.键和内存地址绑定,只要地址不同就是不同键
4.-0===+0 ;NaN === NaN
Map 属性、方法
set(key,value); //设置值,存在则覆盖原来的值
get(key) //获取值,没有 undefined
has(key) // 是否存在 布尔值
delete(key) //删除 布尔值
clear() //清楚所有成员
遍历操作
keys(); //返回键
values(); //返回值
entries(); //返回键值对 ** 为Map结构默认遍历接口,可省略方法的调用
forEach(); //遍历 参数顺序:键值,键名,集合本身
与其他数据结构互相转换
1.Map转化为数组
使用扩展运算符'<b>...</b>';
[...map] //
[...map.keys()]
2.数组转Map,直接作为参数给Map构造函数。
3.Map转对象
Map结构的键都是字符串,可以转为对象。
let obj = Object.create(null);
map.forEach((value,key)=>obj[key]=value);
4.对象转Map
//
function objToString(obj){
let strMap = new Map();
for(let key of Object.keys(obj)){
strMap.set(key,obj[key]);
}
return strMap;
}
objToString({1:"hello","name":"world"});
5.Map转JSON
1.Map结构键名为字符串,转为对象JSON
JSON.stringify(map);
2.Map结构键名有非字符串,转为数组JSON
JSON.stringify([...map]);
6.JSON转Map
WeakMap
可用于存储DOM对象。
1.只接受对象作为键名(null除外)
2.弱引用,自动回收,防止内存泄漏。
3.无法遍历
4.无法清空
属性、方法
get()
set()
has()
delete()
用途
1.应用于DOM结构,保存状态
let dom = document.getElementById("login");
let domMap = new WeakMap();
domMap.set(dom,{clicked:0});
dom.addEventListener('click',function(){
let data = domMap.get(dom);
data.clicked++;
domMap.set(dom,data);
},false);
2.部署类的私有属性