Set 和 WeakSet
Set 对象是值的集合,你可以按照插入的顺序迭代它的元素。 Set 中的元素只会出现一次,即 Set 中的元素是唯一的
Set 类型与 Object 与 Array 类型对比分析
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 
 | let obj = {};
 obj.name = "张三";
 console.log(obj.name);
 
 
 let arr = [];
 arr.push(1, 2, 3, 4, 4, 3, 2, 1);
 console.log(arr);
 
 
 let set = new Set();
 set.add(1);
 set.add(1);
 set.add(2);
 console.log(set);
 
 | 
Set 的增删改查
声明set类型
set增加方法
set增加方法,单个删除,返回布尔类型,清空整个 set 数组,没有返回值
| 12
 3
 4
 
 | set.delete(1);
 
 set.clear();
 
 | 
查询方法
| 12
 3
 4
 5
 6
 7
 8
 
 | console.log(set.size);
 
 
 console.log([...set]);
 
 
 console.log(set.has(1));
 
 | 
Set 和 Array 类型互帮互助
案例一:筛选 set 中大于 5 的值
| 12
 3
 4
 5
 6
 7
 
 | let set = new Set("123456789");set = new Set([...set].filter((item) => item > 5));
 console.log(set);
 
 console.log([...set]);
 
 console.log(Array.from(set));
 
 | 
案例二:利用 set 特性去除数组中的重复值
| 12
 3
 4
 5
 6
 7
 8
 
 | let arr = [1, 2, 3, 1, 5, 4, 2, 1, 4, 5, 1];arr = [...new Set(arr)];
 
 console.log(
 arr.sort((a, b) => {
 return a - b;
 })
 );
 
 | 
Set 的遍历方法
forEach 遍历 set 时的下标和值都是一样的
| 12
 3
 4
 5
 6
 7
 8
 9
 
 | let set = new Set("321");set.forEach((item, index) => {
 console.log(item, index);
 
 
 
 
 
 });
 
 | 
forEach 遍历数组时的下标是正确的下标
| 12
 3
 4
 
 | let setarr = [...set];setarr.forEach((item, index) => {
 console.log(item, index);
 });
 
 | 
使用 for of 遍历也可以直接遍历到 set 里面的值
| 12
 3
 
 | for (let val of set) {console.log(val);
 }
 
 | 
Set 存储唯一名称实例
| 12
 
 | <input type="text" name="input" /><ul></ul>
 
 | 
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 
 | let obj = {data: new Set(),
 setvalue(val) {
 this.data.add(val);
 },
 showdata() {
 let ul = document.querySelector("ul");
 ul.innerHTML = "";
 this.data.forEach((item) => {
 ul.innerHTML += `<li>${item}</li>`;
 });
 },
 };
 let input = document.querySelector("[name='input']");
 input.addEventListener("keyup", (e) => {
 
 if (e.keyCode == 13) {
 if (input.value) {
 obj.setvalue(input.value);
 obj.showdata();
 input.value = "";
 }
 }
 });
 
 | 
利用 Set 取元素的并集,交集,差集
取并集
| 12
 3
 4
 5
 6
 
 | let set1 = [1, 2, 3, 4];let set2 = [3, 4, 5, 6];
 
 
 let bingji = new Set([...set1, ...set2]);
 console.table([...bingji]);
 
 | 
取交集
| 12
 3
 4
 5
 
 | let jiaoji = set1.filter((item) => {
 return set2.includes(item);
 });
 console.log([...jiaoji]);
 
 | 
取差集
| 12
 3
 4
 5
 
 | let chaji = [...new Set([...set1, ...set2])].filter((item) => {
 return !set1.includes(item) || !set2.includes(item);
 });
 console.log(chaji);
 
 | 
引用类型的垃圾回收原理
| 12
 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
 
 | let obj = {name: "李四",
 };
 
 
 let obj1 = obj;
 
 
 obj = null;
 
 
 
 obj1 = null;
 
 console.log(obj);
 console.log(obj1);
 
 let a1 = 666;
 let a2 = a1;
 a1 = 999;
 console.log(a1, a2);
 
 let b1 = (b2 = 999);
 b2 = 666;
 
 console.log(b1, b2);
 
 
 
 
 | 
WeakSet 弱引用类型
WeakSet 对象允许你将弱保持对象存储在一个集合中。
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 
 | let foo = {};let bar = {};
 
 let weakset = new WeakSet();
 weakset.add(foo);
 weakset.add(bar);
 
 
 weakset.delete(foo);
 
 console.log(weakset.has(foo));
 console.log(weakset.has(bar));
 
 console.log(weakset);
 
 | 
TODO 任务列表点击删除功能 – 示例
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 
 | ul {list-style: none;
 }
 
 li {
 padding: 3px;
 border: 2px solid #0703d6;
 margin: 2px;
 width: 200px;
 color: #0703d6;
 transition: 0.5s;
 }
 
 .remove {
 color: grey;
 transition: 0.5s;
 border-color: grey;
 }
 
 | 
| 12
 3
 4
 5
 6
 7
 
 | <div><ul>
 <li>xiaomi10</li>
 <li>xiaomi9</li>
 <li>xiaomi6</li>
 </ul>
 </div>
 
 | 
| 12
 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
 
 | class TODE {
 constructor() {
 
 this.weakset = new WeakSet();
 
 this.lis = document.querySelectorAll("li");
 
 this.lis.forEach((item) => {
 
 this.weakset.add(item);
 });
 }
 run() {
 
 this.lis.forEach((item) => {
 
 item.addEventListener("click", () => {
 
 if (this.weakset.has(item)) {
 
 this.weakset.delete(item);
 
 item.classList.add("remove");
 } else {
 this.weakset.add(item);
 item.classList.remove("remove");
 }
 });
 });
 }
 }
 
 new TODE().run();
 
 |