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 });


浙公网安备 33010602011771号