Set 用法

// 可以当做数组去使用,数组本身也算是集合,但是Set集合中的元素是不重复的
{
  let list = new Set();
  list.add(5);
  list.add(7);

  console.log('size',list.size);// 2
}

{
    // Set对数组进行了转换,成为了Set集合
  let arr = [1,2,3,4,5];
  let list = new Set(arr);

  console.log('size',list.size); // 5
}

{
//Set数据是唯一的,添加重复元素不会报错,但是不会生效
  let list = new Set();
  list.add(1);
  list.add(2);
  list.add(1);

  console.log('list',list);// Set类型的1,2

//利用Set的特性,可以数组去重
// 不会做数据类型的转换
  let arr=[1,2,3,1,'2'];
  let list2=new Set(arr);

  console.log('unique',list2); // Set{1,2,3,"2"}
}

{
    let arr=['add','delete','clear','has'];
    let list=new Set(arr);
    
    // 判断有某个元素
    console.log('has',list.has('add'));// true
    
    // 删除某个元素
    console.log('delete',list.delete('add'),list);// Set{'delete','clear','has'}
    
    //清空元素
    list.clear();
    console.log('list',list);//Set{}
}

{
    let arr=['add','delete','clear','has'];
    let list=new Set(arr);
    
    // Set中key,value的值是一样的
    
    for(let key of list.keys()){
        console.log('keys',key);
        // keys add
         // keys delete
          // keys clear
           // keys has
    }
    
    // 默认显示的是value的值
    for(let value of list){
        console.log('value',value);
        // value add
         // value delete
          // value clear
           // value has
    }
    
    for(let value of list.values()){
        console.log('value',value);
        // value add
         // value delete
          // value clear
           // value has
    }
    
    for(let [key,value] of list.entries()){
        console.log('entries',key,value);
        // entries add add
        // entries delete delete
        // entries clear clear
        // entries has has
    }
    
    list.forEach(function(item){console.log(item);})// add delete clear has
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90

WeakSet用法,支持的数据类型只能是对象,不能是其他的,严格来说是:具有 iterable 接口的对象,对象是弱引用,它不会检测这个对象有没有在其他地方使用过,意味着不会与垃圾回收机制挂钩上

{
    let weakList=new WeakSet();
    
    let arg={};
    
    weakList.add(arg);
    
    // weakList.add(2); //不允许其他的数据类型,除了对象
    否则报错Invalid value sued in weak set
    
    console.log('weakList',weakList);
    //WeakSet结构不可遍历,因为成员变量都是对象的弱引用,随时被垃圾回收机制回收,所以WeakSet 结构不会有keys( ),values( ),entries( ),forEach( )等方法和size属性,不能使用clear
    
    // 其他的几个方法和Set是一样的
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

Map用法---遍历和Set是一样的,map中set是可以级联操作的

// key 值可以是任意数据类型
{
    // 第一种定义方式
    let map = new Map();
    let arr=['123'];
    
    // 用数组作为key
    map.set(arr,456);
    
    console.log('map',map,map.get(arr));
    // map Map{["123"]=>456} 456
}

{
    // 第二种定义方式和格式
    let map = new Map([['a',123],['b',456]]);
    console.log('map args',map);
    // 结果 map args  Map{"a"=>123,"b"=>456}
    
    console.log('size',map.size);// 2
    
    console.log('delete',map.delete('a'),map);
    // 结果是 Map{"b"=>456}
    
    console.log('clear',map.clear(),map);// Map{}
    
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27

WeakMap用法

WeakMap结构和Map结构很类似,不同点在于WeakMap结构的键名只支持引用类型的数据,比如数组、对象、函数
跟Map一样,WeakMap也拥有get、has、delete方法,用法和用途都一样。不同地方在于,WeakMap不支持clear方法,不支持遍历,也就没有了keys、values、entries、forEach这4个方法,也没有属性size。
理由跟WeakSet结构一样:键名中的引用类型是弱引用,你永远不知道这个引用对象什么时候会被垃圾回收机制回收了,如果这个引用类型的值被垃圾机制回收了,WeakMap实例中的对应键值对也会消失

{
  let weakmap=new WeakMap();

  let o={};
  weakmap.set(o,123);
  console.log(weakmap.get(o)); // 123
}

{
    let wm = new WeakMap();

    //数组类型的键名
    wm.set([1],2);

    //对象类型的键名
    wm.set({'name':'Zhangsan'},2);

    //函数类型的键名
    function fn(){};
    wm.set(fn,2);

    console.log(wm);
    //打印:WeakMap {
            [1] => 2, 
            Object {name: "Zhangsan"} => 2, 
            function => 2
            }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29