WeakSet和Set类似,同样是元素不重复的集合,它们的区别是WeakSet内的元素必须是对象,不能是其它类型。

特性:

1.元素必须是对象。

添加一个number类型的元素。

const ws = new WeakSet()
ws.add()

结果是报类型错误。

TypeError: Invalid value used in weak set

添加一个对象。

const ws = new WeakSet()
var a = {p1:'1', p2:'2'}
ws.add(a)
console.log(ws.has(a));

添加OK,结果显示:

true

可以通过WeakSet的has方法判断一个元素是否已在集合中。

如果不需要存储元素时,可以使用delete方法删除元素。

2.弱引用,不被计入垃圾回收

添加进WeakSet的元素对象,WeakSet不会对元素对像的引用计数加1,对于被添加进WeakSet的元素对象,只要该元素对象没有被除WeakSet以外的其他对象引用,就会被垃圾回收释放,在WeakSet中的该元素对象自动被释放,不会出现内存泄漏。

因为这一特性,其性能要比map要高,对于存储无顺序要求的,不重复的,临时存储的场景,可以使用它。

const ws = new WeakSet()
var a = {p1:'1', p2:'2'} ws.add(a)
a = null
console.log(ws.has(a));

先将对象添加到WeakSet中,然后将对象设成null,然后再下面的has方法判定时,结果显示,表示WeakSet中已经不存在该对象。

false

3.不能遍历

因为其对内部的元素对象是弱引用,随时会被垃圾回收释放掉,所以其不支持size和forEach等遍历方法。

End

ES6,新增数据结构WeakSet的用法的更多相关文章

  1. ES6,新增数据结构Map的用法

    Javascript的Object本身就是键值对的数据结构,但实际上属性和值构成的是”字符串-值“对,属性只能是字符串,如果传个对象字面量作为属性名,那么会默认把对象转换成字符串,结果这个属性名就变成 ...

  2. ES6,新增数据结构Set的用法

    ES6 提供了新的数据结构 Set. 特性 似于数组,但它的一大特性就是所有元素都是唯一的,没有重复. 我们可以利用这一唯一特性进行数组的去重工作. 单一数组的去重. let set6 = new S ...

  3. ES6——新增数据结构Set与Map的用法

    ES6 提供了新的数据结构 Set以及Map,下面我们来一一讲解. 一.Set 特性 似于数组,但它的一大特性就是所有元素都是唯一的,没有重复. 我们可以利用这一唯一特性进行数组的去重工作. 1.单一 ...

  4. ES6新增的 Set 和 WeakSet 是什么玩意?在此揭晓

    现在的章节内容会更加的紧密,如果大家看不懂可以先去看以前的文章,当然看了的忘了,也可以去看一下,这样学习后面的内容才会更加容易. 什么是Set结构 Set是ES6给开发者带来的一种新的数据结构,你可以 ...

  5. es6新增功能

    声明命令 1. let命令 ES6新增了let命令,用来声明变量.它的用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效.下面代码在代码块之中,分别用let和var声明了两个变量.然 ...

  6. ES6新增语法和内置对象(let,const, Array/String/Set 扩展方法(解构赋值,箭头函数,剩余参数))

    1.let ES6中新增的用于声明变量的关键字. let 声明的变量只在所处于的块级有效. 注意:使用 let 关键字声明的变量才具有块级作用域,var 关键字是不具备这个特点的. 1. 防止循环变量 ...

  7. 【ES6新增语法详述】

    目录 1. 变量的定义 let const 2. 模版字符串 3. 数据解构 4. 函数扩展 设置默认值 箭头函数 5. 类的定义 class 6. 对象的单体模式 "@ ES6新增了关于变 ...

  8. ECMAScript简介以及es6新增语法

    ECMAScript简介 ECMAScript与JavaScript的关系 ECMAScript是JavaScript语言的国际化标准,JavaScript是ECMAScript的实现.(前者是后者的 ...

  9. ES6新增的数据类型Map和Set。

    Javascript的默认对象表示方式 {} ,即一组键值对. 但是Javascript的对象有个小问题,就是键必须是字符串.但实际上Number或者其他数据类型作为键也是非常合理的. 为了解决这个问 ...

随机推荐

  1. 2014年辛星Javascript解读第三节

    经过第一节的入门和第二节的运算符.那么接下来我们就能够学习Javascript的函数了,当然了.无论大家之前学习的是什么编程语言.都会有函数的概念,假设大家学的是Pascal,还会有"过程& ...

  2. Debug 路漫漫-02

    重现标准 BTL Model ,using MATLAB: 1. 错误使用 cat要串联的数组的维度不一致.出错 cell2mat (line 83) m{n} = cat(1,c{:,n}); —— ...

  3. Spring Boot中MyBatis的使用

    orm框架的本质是简化编程中操作数据库的编码,发展到现在基本上就剩两家了,一个是宣称可以不用写一句SQL的hibernate,一个是可以灵活调试动态sql的mybatis,两者各有特点,在企业级系统开 ...

  4. Event事件的兼容性(转)

    window.event问题问题说明:window.event 只能在IE下运行,而不能在Firefox下运行,这是因为Firefox的event只能在事件发生的现场使用.解决方法:在事件发生的函数上 ...

  5. 【Algorithm】堆排序

    堆是一种完全二叉树结构,并且其满足一种性质:父节点存储值大于(或小于)其孩子节点存储值,分别称为大顶堆.小顶堆.堆一般采用数组进行存储(从下标为0开始).则父节点位置为i,那么其左孩子为2*i + 1 ...

  6. linux 监控性能学习笔记(1)

    top命令中的 load average后面的三个数字分别表示距离现在一分钟,五分钟,十五分钟的负载情况. 在单核系统中100%利用负载标识为1.00,双核系统标识2.00 四核系统标识为4.00 因 ...

  7. linux文件系统 - 初始化(二)

    加载initrd(上) 一.目的 本文主要讲述linux3.10文件系统初始化过程的第二阶段:加载initrd. initrd是一个临时文件系统,由bootload负责加载到内存中,里面包含了基本的可 ...

  8. Java原理之HashMap

    一下JDK1.7测试没问题,1.8就不一样了,应该散列的更优化. 最近看了很多java底层之HashMap的原理,根据自己的实现如下: package com.gmq.chapter02; impor ...

  9. 使用C#WebClient类访问(上传/下载/删除/列出文件目录)

    在使用WebClient类之前,必须先引用System.Net命名空间,文件下载.上传与删除的都是使用异步编程,也可以使用同步编程, 这里以异步编程为例: 1)文件下载: static void Ma ...

  10. html中的a标签

    <a> 标签定义超链接,用于从一张页面链接到另一张页面.最重要的属性是 href 属性,它指示链接的目标,<href="#">表示跳转到自己.我们通常通过C ...