Set 和 WeakSet
Set 对象是值的集合,你可以按照插入的顺序迭代它的元素。 Set 中的元素只会出现一次,即 Set 中的元素是唯一的
Set 类型与 Object 与 Array 类型对比分析
1 2 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 数组,没有返回值
1 2 3 4
| set.delete(1);
set.clear();
|
查询方法
1 2 3 4 5 6 7 8
| console.log(set.size);
console.log([...set]);
console.log(set.has(1));
|
Set 和 Array 类型互帮互助
案例一:筛选 set 中大于 5 的值
1 2 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 特性去除数组中的重复值
1 2 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 时的下标和值都是一样的
1 2 3 4 5 6 7 8 9
| let set = new Set("321"); set.forEach((item, index) => { console.log(item, index);
});
|
forEach 遍历数组时的下标是正确的下标
1 2 3 4
| let setarr = [...set]; setarr.forEach((item, index) => { console.log(item, index); });
|
使用 for of 遍历也可以直接遍历到 set 里面的值
1 2 3
| for (let val of set) { console.log(val); }
|
Set 存储唯一名称实例
1 2
| <input type="text" name="input" /> <ul></ul>
|
1 2 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 取元素的并集,交集,差集
取并集
1 2 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]);
|
取交集
1 2 3 4 5
| let jiaoji = set1.filter((item) => { return set2.includes(item); }); console.log([...jiaoji]);
|
取差集
1 2 3 4 5
| let chaji = [...new Set([...set1, ...set2])].filter((item) => { return !set1.includes(item) || !set2.includes(item); }); console.log(chaji);
|
引用类型的垃圾回收原理
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
| 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 对象允许你将弱保持对象存储在一个集合中。
1 2 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 任务列表点击删除功能 – 示例
1 2 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; }
|
1 2 3 4 5 6 7
| <div> <ul> <li>xiaomi10</li> <li>xiaomi9</li> <li>xiaomi6</li> </ul> </div>
|
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
| 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();
|