Set
Set,ES6中新的数据结构,类似于数组,但是成员的值都是唯一的,没有重复。
const a = new Set();
[2,3,2,3,4,5,6].forEach(item => a.add(item));
//遍历输出a的值
for (let i of a){
console.log(i);
}
//2 3 4 5 6
//说明Set不会添加重复的值。
Array.from方法可以将Set结构转为数组
function quchong(array){
return (Array.from(new Set(array)))
}
quchong([1,2,3,2,1])
//[1,2,3]
Set函数可以接受一个数组或者类似数组的对象作为参数来初始化。
const set = new Set([1,2,3,4,4]);
[...set]
//[1,2,3,4];
运用set可以进行数组去重(划重点。。) […new Set(array)]
Set内部用类似于全等的算法计算值,不同的是NaN等于NaN,两个对象总是不相等。
Set实例的属性
- Set.prototype.constructor : 就是Set构造函数
- Set.prototype.size : 返回Set实例的成员总数
Set实例的四个操作方法
- add(value) : 添加某个值,返回Set结构本身
- delete(value) : 删除某个值,返回布尔值表示是否删除成功
- has(value) : 返回一个布尔值,表示该值是否为Set的成员
- clear() : 清除所有成员,没有返回值。
Set实例的四个遍历方法
- keys() : 返回键名的遍历器
- values() : 返回键值的遍历器
- entries() : 返回键值对的遍历器
- forEach() : 使用回调函数遍历每个成员
Set结构没有键名,所以键名和键值是同一个值,所以keys和values方法的行为完全一致。
WeakSet
WeakSet与Set类似,但是传入的数组成员只能是对象,并且这个对象属于弱引用,这个引用不计入垃圾回收机制里面的计数。
const ws = new WeakSet([{a:1},{b:2}])
ws // WeakSet{Object {a:1},Object {b:2}}
WeakSet结构的三个方法
- add() : 添加某个对象,返回WeakSet结构本身
- delete() : 删除某个对象,返回布尔值表示是否删除成功
- has() : 返回一个布尔值,表示该对象是否为WeakSet的成员
WeakSet没有size属性,无法遍历成员。不能遍历是因为引用都是弱引用,随时可能消失。WeakSet的一个用处是储存DOM节点。
Map
JS里面的对象,本质上是键值对的集合,但是键只能用字符串,不能用别的例如对象。而Map可以做到键的范围不限于字符串。
const obj = {a:1};
const data = {};
data[obj] = 'hello';
data // {[object Object]: "hello"} 会转化成字符串
const m = new Map();
const o = {p:'hello world'};
m.set(o,'content');
m.get(o) //'content' 使用get方法读取
Map可以接受一个数组作为参数。
const map = new Map([ ['name','tom'],['age','10'] ])
map.get('name'); //'tom'
Map 的键实际上是跟内存地址绑定的,只要内存地址不一样,就视为两个键。undefined和null是两个不同的键。
Map实例的属性
- Map.prototype.constructor : 就是Map构造函数
- Map.prototype.size : 返回Map实例的成员总数
Map实例的操作方法
- set(key,value) : 设置键名key对应键值value,返回整个Map结构。key若已存在则更新键值。
- get(key) : get方法读取key对应的键值,找不到返回undefined。
- has(key) : 返回一个布尔值表示键值是否在当前Map对象中。
- delete(key) : 删除某个键,返回布尔值表示是否删除成功。
- clear() : 清除所有成员,没有返回值。
Map实例的遍历方法
- keys() : 返回键名的遍历器
- values() : 返回键值的遍历器
- entries() : 返回所有成员的遍历器
- forEach() : 使用回调函数遍历每个成员
1.Map转为数组
const myMap = new Map()
.set(true, 7)
.set({foo: 3}, ['abc']);
myMap // Map(2){true => 7 ,Object {foo : 3} => ['abc']}
[...myMap]
// [ [true,7] , [ {foo:3} , ['abc'] ] ]
//[ [key,value],[key,value],..... ]
2.数组转为Map
new Map([
[1,'a'],
[2,'b']
])
Map(2){1=>"a",2=>"b"}
3.Map转为对象
//Map键都是字符串
const myMap = new Map().set('aa',1).set('bb',2);
let obj = {};
for(let [k,v] of myMap){
obj[k] = v;
}
4.对象转为Map
let strMap = new Map();
let obj = {aa:1,bb:2}
for(let k of Object.key(obj)){
strMap.set(k,obj[k]);
}
5.Map转JSON
let myMap = new Map().set('aa',1).set('bb',2);
转为对象,再用JSON.stringify(obj)
如果有非字符串的键值,则用JSON.stringify([...myMap])
6.JSON转Map
JSON.parse(),然后再用对象转换成map数据方法转换。- -...
WeakMap
WeakMap只接受对象作为键名(null除外),不接受其他类型的值作为键名。而且,WeakMap的键名所指的对象不计入垃圾回收机制。基本上,如果你要往对象上添加数据,又不想干扰垃圾回收机制,就可以使用 WeakMap。
注意,WeakMap 弱引用的只是键名,而不是键值。键值依然是正常引用。就是键值还是计入垃圾回收机制。
WeakMap没有遍历操作,也没有size属性。只有四个方法,get(),set(),has(),delete()。