ES6小知识续集

1:set的一些使用

 1 //创建set结构
 2 const arr = new Set()
 3 arr.add(30)
 4 arr.add(40)
 5 arr.add(50)
 6     //set里面元素不能重复
 7 arr.add(30)
 8 console.log(arr);
 9 //应用场景 数组去重
10 const arr1 = [10, 20, 10, 30, 40, 50]
11 const names = ['lili', 'qiiq', 'yaya']
12 const setarr1 = new Set(arr1)
13 const setarr2 = new Set(arr1)
14     //set支持展开运算符
15 const set2 = [...setarr1]
16     //转换成为数组
17 const set3 = Array.from(setarr1)
18 console.log(setarr1);
19 console.log(set2);
20 console.log(set3);
21 //size属性
22 console.log(setarr1.size);
23 //set方法
24 setarr1.add(60)
25 setarr1.delete(20)
26 setarr2.clear()
27 setarr2.has(20)
28 setarr1.has(20)
29 //遍历
30 setarr1.forEach(element => {
31     console.log(element);
32 });
33 for (const item of setarr1) {
34     console.log(item);
35 }

 

 2:WeakSet和Set的区别

区别:只能存储对象类型,不能存放基本数据类型 WeakSet对象是一个弱引用

从根对象开始,有引用指着就不会被回收

强引用 strong reference 在GC回收时候是有效的

弱引用 weak reference GC不把弱引用当条线

总结弱引用:通过线获取值,但是可以直接回收

应用场景:想要只能创建的对象才能调用某方法

 1 const pwset = new WeakSet()
 2 class Person {
 3     constructor() {
 4         pwset.add(this)
 5     }
 6     running() {
 7         if (!pwset.has(this)) throw new Error("不能通过其他对象调用running方法")
 8         console.log("running", this);
 9     }
10 }
11 var p = new Person()
12     //可以正常调用 因为是通过 New Person的方式
13 p.running()
14     //不可以正常调用 会抛出异常
15     // p.running.call({ name: 'tyy' })

3:Map和weakMap

Map的基本使用:

 1 //map的创建过程
 2 const map = new Map()
 3 const obj = { name: 'tyy' }
 4 const obj1 = { name: "tsf" }
 5 map.set(obj, "aaa")
 6 map.set(obj1, "bbb")
 7 map.set(1, "ccc")
 8 console.log(map);
 9 const map2 = new Map([
10     [obj, "aaa"],
11     [obj1, "bbb"],
12     [1, "ccc"]
13 ])
14 console.log(map2);
15 //常见的属性和方法 set get has delete clear() froEach
16 console.log(map.size);
17 console.log(map.has(obj));

 

 weakMap

和Map的区别

1:weakMap key只能是对象类型,不能是基本数据类型

2:weakMap key 与value是弱引用

基本使用:

1 const obj = { name: 'tyy' }
2 const obj1 = { age: 20 }
3 const weakMap = new WeakMap()
4 weakMap.set(obj, 'aaa')
5 console.log(weakMap);
6 //weakMap的常见的一些法 get set has delete
7 //weakMap没有forEach方法 和size属性

weakMap的应用场景,类似于Vue里面的响应式原理,这里我们把响应式当做,当对象里面的某值发生改变,某几个函数执行

 1 // 应用场景(vue3响应式原理)
 2 const obj1 = {
 3     name: 'tyy',
 4     age: 20
 5 }
 6 const obj2 = {
 7         mood: 'happy',
 8         address: 'libray'
 9     }
10     //监听obj1 name 变化的函数
11 function obj1NameFn1() {
12     console.log('obj1NameFn1执行');
13 }
14 
15 function obj1NameFn2() {
16     console.log('obj1NameFn2执行');
17 }
18 //监听 obj1 age变化的函数
19 function obj1AgeFn1() {
20     console.log('obj1AgeFn1执行');
21 }
22 
23 function obj1AgeFn2() {
24     console.log('obj1AgeFn2执行');
25 }
26 //监听obj2 mood变化的函数
27 function obj2moodFn1() {
28     console.log('obj2moodFn1执行');
29 }
30 
31 function obj2moodFn2() {
32     console.log('obj2moodFn2执行');
33 }
34 //监听obj2 address变化的函数
35 function obj2addressFn1() {
36     console.log('obj2addressFn1执行');
37 }
38 
39 function obj2addressFn2() {
40     console.log('obj2addressFn2执行');
41 }
42 
43 
44 // 1.创建WeakMap
45 const weakMap = new WeakMap()
46 
47 // 2.收集依赖结构
48 // 2.1.对obj1收集的数据结构
49 const map1 = new Map()
50 map1.set('name', [obj1NameFn1, obj1NameFn2])
51 map1.set('age', [obj1AgeFn1, obj1AgeFn2])
52 weakMap.set(obj1, map1)
53     // 2.2.对obj2收集的数据结构
54 const map2 = new Map()
55 map2.set('mood', [obj2moodFn1, obj2moodFn2])
56 map2.set('address', [obj2addressFn1, obj2addressFn2])
57 weakMap.set(obj2, map2)
58     // 3.如果obj1.name发生了改变
59     // Proxy/Object.defineProperty 用来监听属性的这里没有监听
60 obj1.name = 'change'
61 const targetMap = weakMap.get(obj1)
62 const fns = targetMap.get('name')
63 fns.forEach(fn => {
64     fn()
65 
66 });

 

posted @ 2022-03-24 20:38  沁霓  阅读(46)  评论(0)    收藏  举报