02-ES6-Object.is(a,b) / Set数据结构 / Array.from()将Set结构或类数组转为数组/ES6处理内存泄漏/ 证明weakMap的弱引用

Object.js()
 ES5比较两个值是否相等,只有两个运算符:相等运算符(==)和严格相等运算符(===)。
 它们都有缺点,==会自动转换数据类型,===的NaN不等于自身,以及+0等于-0。
 JavaScript缺乏一种运算,在所有环境中,只要两个值是一样的,它们就应该相等。

 Set数据结构: 本身是一个构造函数,用来生成Set数据结构。它类似于数组,但是成员的值都是唯一的,没有重复的值。

1. set做数组去重,也可以给类数组去重

 2.set内部NaN与NaN是相等的,这点与Object.is(NaN,NaN)一致

 3.set数据结构通过size拿到去重后的数据长度


 

4.Set实例的方法分为两大类:操作方法(用于操作数据)和遍历方法(用于遍历成员)

(1)操作方法:

add(value):添加某个值,返回Set结构本身。

delete(value):删除某个值,返回一个布尔值,表示删除是否成功。

has(value):返回一个布尔值,表示该值是否为Set的成员。

clear():清除所有成员,没有返回值。


Array.from方法可以将Set结构转为数组。Set负责去重,Array.from()负责转化为真正的数组


(2)遍历方法:

 keys():返回键名的遍历器

values():返回键值的遍历器

entries():返回键值对的遍历器

forEach():使用回调函数遍历每个成员

需要特别指出的是,Set的遍历顺序就是插入顺序。这个特性有时非常有用,比如使用Set保存一个回调函数列表,调用时就能保证按照添加顺序调用。

 map 和 filter用法:

 使用Set可以很容易的实现 1.做去重合并 2.找到共有值  3.不同值

 在遍历中去改变原有Set结构:用新的Set重新赋值给老Set:

1)用map

 2)用Array.from(类数组,map方法)


 WeakSet 结构

几大特点:

1. 与Set类似,是一个不重复值的集合

2.WeakSet成员只能是对象,如:new WeakSet( [ [1,2]  , [3,4] ] ) ;   new WeakSet( [{name:'zs',age:18}] );

3.WeakSet中的对象都是弱引用,垃圾回收机制就是其他对象不引用WeakSet这个对象了,就把你给回收释放掉,释放掉就意味着WeakSet中对象就没了,不会让你占坑不干活的,

所以WeakSet不能像Set那样有遍历方法。也没有size属性。

因为我们平时在处理内存泄漏的时候,都是自己要手动去处理,及时清除引用非常重要。但是,你不可能记得那么多,有时候一疏忽就忘了,所以才有那么多内存泄漏。

4. 三个实例方法:

(1).add(value):向WeakSet实例添加一个新成员

(2).delete(value):清除WeakSet实例的指定成员。

(3).has(value):返回一个布尔值,表示某个值是否在WeakSet实例之中。

 


 把构造函数内的this(以后的实例对象)添加进WeakSet中,这样每个实例天生自带防内存泄漏的特性。

 


如何证明WeakMap是弱引用,自动被垃圾回收了?

map:

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title></title>
</head>

<body>

</body>

</html>
<script>
  function Teacher() { }
  let teacher = new Teacher()
  let m = new Map()
  m.set(teacher, 1)
  teacher = null

</script>

我们打开浏览器:先到Memory(内存)工具中,点击左上角原点拍个快照,然后搜索teacher,我们可以看到Teacher这个构造函数,虽然我们手动把teacher这个实例设置为了null,但是还能在内存中看到他。说明Map还在引用他,并没有被垃圾回收

 接着我们使用weakMap:

 

发现再次搜索teacher这个实例就找到他的构造函数了,说明WeakMap去set的这个teacher已经被回收了,断连了,那么自然Teacher这个构造函数也就被回收了

 

 

 

posted @ 2021-03-24 23:44  猎奇游渔  阅读(40)  评论(0编辑  收藏  举报