《红宝书》 |Set与WeakSet
Set
Set也称集合
实例化
cont s=new Set()
//可传入一个可迭代对象,其中是插入到Set实例的元素
const s=new Set(["val1","val2","val3"])
基本API
add(val)
:添加元素。(返回set实例,可连写)has(val)
:查询指定值是否存在delete(val)
:删除元素。(返回布尔值,表示实例中是否存在要删除的元素)clear()
:清空元素size
属性:获取元素数量const s=new Set() s.add("apple").add("strawberry") //添加元素 s.has("apple") //true s.size //2 s.delete("apple") //删除元素 s.has("apple") //false s.claer() //清空元素 s.size //0
Set特性
- Set可以将任何JavaScript数据类型作为元素
const s=new Set() const functionVal=function(){} const symbolVal=Symbol() const objectVal=new Object() s.add(functionVal).add(symbolVal).add(objectVal)
- 修改set集合中的元素不会影响其作为集合值的身份
//当元素为原始值时,值不会被修改 const s1=new Set(["val"]) for(let value of s1.values()){ value="newVal" console.log(s1.has(value)) //false console.log(s1.has("val")) //true } //当元素为引用值时,修改其属性,该元素仍然在集合中 const objKey={id:1} const s2=new Set([objKey]) for(let value of s2.values()){ value.id=2 console.log(s2.has(objKey)) //true }
迭代应用
keys()
:返回键的遍历器values()
:返回值的遍历器entries()
:返回键值对的遍历器forEach()
:对每个元素执行某种操作,没有返回值//set结构的键与值是同一个,所以keys()和values()的行为完全一致 let set = new Set(['red', 'green', 'blue']); for (let item of set.keys()) { console.log(item); } // red // green // blue for (let item of set.values()) { console.log(item); } // red // green // blue for (let item of set.entries()) { console.log(item); } // ["red", "red"] // ["green", "green"] // ["blue", "blue"]
let set = new Set([1, 2, 3]); set.forEach((value, key) => console.log(value * 2) ) // 2 // 4 // 6
其他应用
- 转换为数组
let set = new Set(['red', 'green', 'blue']); [...set] //['red', 'green', 'blue']
- 去除数组重复元素
let arr = [3, 5, 2, 2, 5, 5]; let unique = [...new Set(arr)]
- 结合数组的map方法、filter方法,实现Map的遍历和过滤:
let set = new Set([1, 2, 3]); set = new Set([...set].map(x => x * 2)); // 返回Set结构:{2, 4, 6} let set = new Set([1, 2, 3, 4, 5]); set = new Set([...set].filter(x => (x % 2) == 0)); // 返回Set结构:{2, 4}
- 并集(Union)、交集(Intersect)和差集(Difference)
let a = new Set([1, 2, 3]); let b = new Set([4, 3, 2]); // 并集 let union = new Set([...a, ...b]); // 交集 let intersect = new Set([...a].filter(x => b.has(x))); // 差集 let difference = new Set([...a].filter(x => !b.has(x)));
WeakSet
WeakSet是Set的兄弟类型,其API也是Set的子集。WeakSet中的Weak指的是JavaScript垃圾回收程序对待弱集合中元素的方法。
实例化
const ws=new WeakSet()
弱集合特性
弱集合中的值只能是Object或者是继承自Object的类型,否则会抛出TypeError错误。
const val1={id:1},val2={id:2},val3={id:3}
const ws=new WeakSet([val1,val2,val3])
初始化是全有全无的操作,只要有一个键不符合要求,那么就初始化失败:
const val1={id:1},val2={id:2},val3={id:3}
const ws=new WeakSet([val1,"hello",val3])
原始值可先转换为原始包装类型再作为值:
const strVal=new String("hello")
const ws=new WeakSet([strVal])
与Set相比,WeakSet是不可迭代的
基本API
add(val)
:添加元素。(返回set实例,可连写)has(val)
:查询指定值是否存在delete(val)
:删除元素。
与Set相比,少了
clear()
和size
属性。