Set和WeakSet
一、Set
Set是ES6给开发者带来的一种新的数据结构,你可以理解为值的集合,同时它的值不会有重复项。
Set的方法
-
Set的初始化
let set = new Set([1, 2, 3, [1]]) console.log(set) //Set(4) {1, 2, 3, Array(1)}
-
add()方法 用于给set中添加成员
set.add(4) //4成功加入 set.add(2) //因为set本来有2,所以不会产生影响 console.log(set) //Set(5) {1, 2, 3, Array(1), 4}
-
size属性 获取set长度
console.log(set.size) //5
-
delete属性 删除属性 成功true 失败 false
console.log(set.delete(2)) //true console.log(set) //Set(4) {1, 3, Array(1), 4} console.log(set.delete([1])) //false 为什么会是false呢,看文章末尾解释 console.log(set) //Set(4) {1, 3, Array(1), 4}
-
clear()方法 清除所有成员
set.clear() console.log(set) //Set(0) {size: 0}
-
has()方法 判断set结构中是否含有指定的值。如果有,返回true;如果没有,返回fasle。
//使用前先把clear方法注释掉,才会跟此代码块结果一致 console.log(set.has(1)) //true console.log(set.has([1])) //false 为什么会是false呢,看文章末尾解释
-
entries()方法 返回一个键值对的遍历器。
console.log(set.entries()) //SetIterator{1 => 1, 3 => 3, Array(1) => Array(1), 4 => 4} for (let [key, value] of set.entries()) { console.log(key); //遍历键 console.log(value); //遍历值 可以发现set的键和值一样 }
-
keys()方法 返回键名的遍历器
for (let key of set.keys()) { console.log(key) // 1 3 [1] 4 }
-
values()方法 返回键值的遍历器
for (let value of set.values()) { console.log(value) // 1 3 [1] 4 }
-
forEach 遍历
set.forEach((item, index) => { // console.log(item); console.log(index) // 1 3 [1] 4 })
-
Set应用→数组去重
let arr_2 = [1, 2, 3, 4, 1, 2] console.log(arr_2) console.log(Array.from(new Set(arr_2))) //法一 Array.from console.log([...new Set(arr_2)]) //法二 扩展运算符
二、WeakSet
-
注意点 → 成员必须是引用类型的值。
// let weak = new WeakSet([1, 2, 3]) // Invalid value used in weak set let weak = new WeakSet([{ name: 'zs' }, [1, 2, 3], set]) console.log(weak) // WeakSet结构也提供了add()方法,delete()方法,has()方法给开发者使用,作用与用法跟Set结构完全一致。 // 不可遍历 没有size属性 entires keys values forEach 没有
三、为什么会是false
-
因为数组是引用类型,他们的值相等,但地址不相等,举个例子
let arr = [3] let arr_1 = [3] console.log(arr == arr_1) //false