Set(强引用)
四个操作方法:
Set.prototype.add(value):添加某个值,返回 Set 结构本身。Set.prototype.delete(value):删除某个值,返回一个布尔值,表示删除是否成功。Set.prototype.has(value):返回一个布尔值,表示该值是否为Set的成员。Set.prototype.clear():清除所有成员,没有返回值。
四个遍历方法:
Set.prototype.keys():返回键名遍历器Set.prototype.values():返回键值遍历器Set.prototype.entries():返回键值对遍历器Set.prototype.forEach():使用回调函数遍历每个成员
// 1.创建Set (强引用)
const set = new Set() //创建后数组里面内容与内容地址是强引用不会销毁
//添加元素
set.add(10)
set.add(20)
set.add(30)
const info = {}
const obj = {name:'obj'}
//添加对象
set.add(info)
set.add(obj)
// 数组去重
const names = ['abc','bcd','cde','efg','abc']
const setname = new Set(names) //set数组
const setname2 = [...setname]
const setname3 = Array.from(setname)
// console.log("setname",setname);
// console.log("setname2",setname2);
// console.log("setname3",setname3);
// set其他属性和方法
console.log("set",set)
console.log("set.size",set.size) //查看大小
set.delete(info) //删除
console.log("set.has(info)",set.has(info)); //查看当前数组里是否有当前元素
console.log("set.has(info)",set.has(obj)); //查看当前数组里是否有当前元素
set.forEach(item=>console.log("item",item)) //循环
// set支持 for...of...
for (const iterator of set) {
console.log("for...of...",iterator);
}
console.log("set.size",set)
WeakSet(弱引用)
WeakSet 不能遍历,是因为成员都是弱引用,随时可能消失
WeakSet 结构有以下三个方法。
WeakSet.prototype.add(value):向 WeakSet 实例添加一个新成员。WeakSet.prototype.delete(value):清除 WeakSet 实例的指定成员。WeakSet.prototype.has(value):返回一个布尔值,表示某个值是否在WeakSet实例之中。
// 1.Weak Reference(弱引用)和Strong Reference(强引用)
let obj1 = { name: "why" }
let obj2 = { name: "kobe" }
let obj3 = { name: "jame" }
// let arr = [obj1, obj2, obj3]
// obj1 = null
// obj2 = null
// obj3 = null
// const set = new Set(arr) //arr里面的内容引用地址是强引用 不会销毁
// arr = null
// 2.WeakSet的用法
// 2.1.和Set的区别一: 只能存放对象类型
const weakSet = new WeakSet() //创建数据里内容的引用地址是弱引用 外部未使用会被认为没有使用 会进行销毁
weakSet.add(obj1)
weakSet.add(obj2)
weakSet.add(obj3)
console.log("weakSet",weakSet);
// 2.2.和Set的区别二: 对对象的引用都是弱引用
// 3.WeakSet的应用
const pWeakSet = new WeakSet()
class Person {
constructor() {
console.log("this",this);
pWeakSet.add(this)
}
running() {
if (!pWeakSet.has(this)) {
console.log("Type error: 调用的方式不对")
return
}
console.log("running~")
}
}
let p = new Person()
// p = null
p.running()
const runFn = p.running
runFn()
const obj = { run: runFn }
obj.run()
区别
WeakSet的成员只能是对象,而不能是其他类型的值。WeakSet中的对象都是弱引用