1. Set 去重进行比较原理是用了 Object.is() 方法,来判断两个值是否相等
2. Set方法汇总:5种
let Set = new Set()
// 1. 增加
Set.add()
// 2. 判断是否存在
Set.has()
// 3. 删除
Set.delete()
// 4. 清空
Set.clear()
// 计算长度
Set.size
let set = new Set()
var arr = [{
name: 'zhou'
}, {
name: 'zhou'
}]
set.add(arr)
console.log(set)
不会对对象去重
3. 将set数组转化为arr
(1) Array.from
(2) 扩展运算符
let set = new Set([1,23,4,5,6,5])
let arr = [...set]
console.log(arr) // [1, 23, 4, 5, 6]
4. set 输出一个对象
let set = new Set()
console.log(set)
// Set(0) {}
会对传入的进行解构(字符串)
let set = new Set('htmlc')
console.log(set) // Set(5) {"h", "t", "m", "l", "c"}
数组:
let set = new Set([1, 2, 5 ,3, 5])
console.log(set) // Set(4) {1, 2, 5, 3}
5. set 遍历 (forEach)
let set = new Set([1, 2, 5 ,3, 5])
set.forEach((value, key, set) => {
console.log(value, key, set)
})
value 和 key 永远是相等的,set表示本身
相当于数据结构中的结合,key、value相同
5. WeakSet
区别:
(1)对于 WeakSet 的实例,若调用 add() 方法时传入了非对象的参数,就会抛出错误(has() 或 delete() 则会在传入了非对象的参数时返回 false );
let weakSet = new WeakSet()
weakSet.add('hhh')
必须传入对象
let weakSet = new WeakSet()
weakSet.add({
name: 'zhiou'
})
console.log(weakSet)
2. Weak Set 不可迭代,因此不能被用在 for-of 循环中;
3. Weak Set 无法暴露出任何迭代器(例如 keys() 与 values() 方法),因此没有任何编程手段可用于判断 Weak Set 的内容;
4. Weak Set 没有 forEach() 方法;
5. Weak Set 没有 size 属性
内存机制和垃圾回收:
一个变化了全变化
let obj = {
name: 'hou'
}
let obj1 = obj
obj.name = 'hhh'
console.log(obj1) // hhh
但要是删除了,另一个不会变
let obj = {
name: 'hou'
}
let obj1 = obj
obj = null
console.log(obj1) // {name: "hou"}
赋值为null相当于删除
weakSet弱引用类型:
let obj = {
name: 'hou'
}
let weakSet = new WeakSet()
weakSet.add(obj)
obj = null
console.log(weakSet)
weakSet 添加对象后,如果对象被清空,被垃圾回收机制删除,系统不会通知weakSet,导致weakSet拿出来的结果是空。这就是weakSet的弱引用,所以weakSet不提供遍历等方法。
而Set会保存存入的值,
对象存储在 Set 的一个实例中时,实际上相当于把对象存储在变量中。只要对于 Set 实例的引用仍然存在,所存储的对象就无法被垃圾回收机制回收,从而无法释放内存。
let obj = {
name: 'hou'
}
let set = new Set()
set.add(obj)
obj = null // 无法被垃圾回收
console.log(set)
除非删除 delete 才能被垃圾回收
当 JS 代码在网页中运行,你想保持与 DOM 元素的联系,在该元素可能被其他脚本移除的情况下,你应当不希望自己的代码保留对该 DOM 元素的最后一个引用(这种情况被称为内存泄漏)。
内存泄漏(Memory Leak)是指程序中己动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。