Set 和 WeakSet 数据结构是ES6新增。

它与数组非常相似,但是Set数据结构的成员都是唯一的。

特别说明:Set 中只能添加一个NaN

一、Set 数据结构:

var set = new Set([1,2,3,4,2,8,10])   // 两个2

for (var elem of set) {
  console.log(elem)
}

//-----------循环用 add 添加赋值 --------------

var set = new Set()

[1,2,3,4,2,8,10].map(function(elem){
  set.add(elem)
}) for (let elem of set) {
  // for...of 遍历
  console.log(elem)
}

//---------------- 扩展运算符 --------------------

var set = new Set ([1,2,3,4,2,8,10])

var arr = [...set]  // 扩展运算符(...)内部使用 for...of 循环

console.log(set)  // [Object set]

console.log(arr)  // 1,2,3,4,2,8,10

//---------------- 清空、删除 --------------------

var set = new Set([1,2,3,4,2,8,10])

set.clear() // 清空

set.delete(8) // 删除

var arr = [...set]

console.log(arr)

//----------------- 遍历键值 ----------------------

set.forEach(function(value,key){
  console.log(value + '=' + key)
})

从输出结果可以看出,键和键值是相同的

//----------------- 判断set中是否含有 -----------

console.log(set.has(8))

//----------------- 遍历值 ------------------------

let setlter = set.values() //把所有的值单独拿出来

for (let val of setlter) {
  console.log(val)
}

//------------------ 数量 -------------------------

console.log(set.size)

//------------------- map 和 filter 也可以用于set中--------

es5中数组新增 map 和 filter 方法

map: 映射的意思,映射返回一个新数组,有返回值;mapArr: 返回一个新对象

var mapArr = array.map(function(value,index,array){
  return value*value
})

filter: 过滤、筛选的意思,有返回值;filterArr: 返回过滤后新数组

var filterArr = array.filter(function(value,index,array){
  if (value > 20) {
    return true
  }   return false
})

//--------------------------------------------------------

let set = new Set([1,2,3])

set = new Set([...set].map(x => x*2))

var arr = [...set]

console.log(arr)

// 返回Set结构: {2,4,6}

let set = new Set([1,2,3,4,5])

set = new Set([...set].filter( x => (x % 2) == 0))

var arr = [...set]

console.log(arr)

// 返回Set结构: {2,4}

//------------------ 求并集、交集、差集 ---------------------

使用 Set 可以很容易地实现并集(Union)、交集(Intersect)和差集(Difference)

let a = new Set([1,2,3])

let b = new Set([4,3,2])

// 并集

let union = new Set([...a,...b])

var arr = [...union]

console.log(arr) // Set {1,2,3,4}

// 交集

let intersect = [...a].filter(x => b.has(x))

即:let intersect = [...a].filter(function(x){
    return b.has(x) // 返回 true,则 x 会被放入 intersect 集合中
  }) console.log(intersect) // Set {2,3}

// 差集

let difference = [...a].filter( x => !b.has(x))

即:let difference = [...a].filter(function(x){
    return !b.has(x)
  }) console.log(difference) // Set {1}

二、WeakSet 数据结构

它与 Set 十分相似,对象的值也不能是重复的,与 Set 不同点:

1.WeakSet 成员只能够是对象

2.作为 WeakSet 成员的对象都是弱引用,即垃圾回收机制不考虑 WeakSet 对该对象的引用,也就是说,如果其他对象都不再引用该对象,那么垃圾回收机制会自动回收该对象所占用的内存,不考虑该对象还存在与WeakSet之中。这个特点意味着,无法引用WeakSet的成员,因此WeakSet是不可遍历的。

3.使用WeakSet存储对象实例的好处是,由于是对对象实例的引用,不会被计入内存回收机制,所以删除实例的时候,不用考虑weaket,也不会出现内存泄漏。                                                         //-----错误------

var weakset = new WeakSet()

weakset.add(5)

//-----正确------

var weakset = new WeakSet()

weakset.add({})  // 添加

var weakset = new WeakSet([[1,2],[3,4]])

//------例子------

var weakset = new WeakSet()

let aObj = {a:'aa'}

let bObj = new String('你好')

let cObj = new Number(8)

weakset.add(aObj)

weakset.add(bObj)

weakset.add(cObj)

//----------- 删除 --------------

weakset.delete(aObj)

bObj = null   // 把对象删除,weakset中的对象也没了,垃圾回收机制,置空

console.log(weakset.has(bObj))  // weakset不能取值,也不能显示,只用来表示是否有重复的对象

.

Set 和 WeakSet 数据结构的更多相关文章

  1. Set和WeakSet数据结构

    学习Set数据结构,注意这里不是数据类型,而是数据结构.它是ES6中新的东西,并且很有用处.Set的数据结构是以数组的形式构建的. Set的声明 let setArr = new Set(['js', ...

  2. ES6系列_11之Set和WeakSet数据结构

    一.Set 1.Set是什么? Set是ES6 提供的一种新的数据结构.类似于数组. 2.Set能解决什么问题 Set和Array 的区别是Set不允许内部有重复的值,如果有只显示一个,相当于去重. ...

  3. ES6 WeakSet数据结构 与Set十分相似

    它与Set十分相似,对象的值也不能是重复的,与Set不同点: .WeakSet成员只能够是对象. .作为WeakSet成员的对象都是弱引用,即垃圾回收机制不考虑WeakSet对该对象的引用,也就是说, ...

  4. ES6 之 Set数据结构和Map数据结构 Iterator和for...of循环

    ECMAScript 6 入门 Set数据结构 基本用法 ES6提供了新的数据结构Set.它类似于数组,但是成员的值都是唯一的,没有重复的值. Set本身是一个构造函数,用来生成Set数据结构. va ...

  5. ECMAScript 6之Set和Map数据结构

    Set 基本用法 ES6提供了新的数据结构Set.它类似于数组,但是成员的值都是唯一的,没有重复的值. Set本身是一个构造函数,用来生成Set数据结构. var s = new Set(); [2, ...

  6. es6学习笔记-set和map数据结构

    ES6 提供了新的数据结构 Set.它类似于数组,但是成员的值都是唯一的,没有重复的值. Set 本身是一个构造函数,用来生成 Set 数据结构. const s = new Set(); [2, 3 ...

  7. 10.Set 和 Map 数据结构

    Set 和 Map 数据结构 Set 和 Map 数据结构 Set 基本用法 ES6 提供了新的数据结构 Set.它类似于数组,但是成员的值都是唯一的,没有重复的值. Set 本身是一个构造函数,用来 ...

  8. ES6的新特性(12)——Set 和 Map 数据结构

    Set 和 Map 数据结构 Set 基本用法 ES6 提供了新的数据结构 Set.它类似于数组,但是成员的值都是唯一的,没有重复的值. Set 本身是一个构造函数,用来生成 Set 数据结构. co ...

  9. es6的Set和Map数据结构

    Set 和 Map 数据结构 Set WeakSet Map WeakMap Set § ⇧ 基本用法 ES6 提供了新的数据结构 Set.它类似于数组,但是成员的值都是唯一的,没有重复的值. Set ...

随机推荐

  1. NOIP2018之前

    先过了初赛再说. \(10.17\) 初赛成绩昨天出了,\(89\)的估分莫名多了\(5\)分问题求解第二题改卷老师看错了?,接下来大概是要停课在一中集训一个月备战\(NOIP\),回去第二天就要期中 ...

  2. sklearn中的投票法

    投票法(voting)是集成学习里面针对分类问题的一种结合策略.基本思想是选择所有机器学习算法当中输出最多的那个类. 分类的机器学习算法输出有两种类型:一种是直接输出类标签,另外一种是输出类概率,使用 ...

  3. PAT甲级1014. Waiting in Line

    PAT甲级1014. Waiting in Line 题意: 假设银行有N个窗口可以开放服务.窗前有一条黄线,将等候区分为两部分.客户要排队的规则是: 每个窗口前面的黄线内的空间足以包含与M个客户的一 ...

  4. 浅谈JVM-类加载器结构与双亲委派机制

    一.类加载器结构 1.引导类加载器(bootstrap class loader) 它用来加载Java的核心库(JAVA_HOME/jre/lib/rt.jar),是用原声代码来实现的,并不继承自ja ...

  5. IPtables/NetFilter

    前提知识 任何主机若要与非同网络中的主机通信,则必须将报文发送到默认网关: 对Linux而言,IP地址是属于主机(内核中)的,不属于网卡,只要属于当前主机的IP地址间,都可直接响应,不称为转发 私有地 ...

  6. PHP正则表达式30分钟入门教程

    正则表达式30分钟入门教程 三个常用的知识点: 1.惰性匹配:正则引擎默认是贪婪的,若要最少重复的话,需要用到惰性匹配符 “?” 懒惰限定符 代码/语法 说明 *? 重复任意次,但尽可能少重复 +? ...

  7. .jar包文件的生成与运行

    首先你得线配置好你的JRE,否则下面的都不会有作用,还没有配置的,请百度上搜索一下如何配置.这里我就不多讲了. jar包是一个可执行的文件包,简单说jar包就是一个外包.Java 程序是由若干个 .c ...

  8. 【微信小程序】在js中导入第三方js或自己写的js,使用外部js中的function的两种方法 import和require的区别使用方法 【外加:使用第三方js导出的默认function的调用方法】

    如下 定义了一个外部js文件,其中有一个function import lunaCommon from '../lunaCommon.js'; var ctx = wx.getStorageSync( ...

  9. 关于comparator接口和comparable接口以及它们各自的方法compare()和compareTo()

    在今天做的LeetCode的题中有两道都出现了利用接口实现对象的排序.两题的相关链接: 1.利用comparable接口对对象排序 2.利用comparator接口实现排序 因为之前都没接触过这两个接 ...

  10. node最简单的升级

    1.安装n插件 npm install -g n //全局安装 2.升级 n stable //升级 3.packjson升级 npm i -g npm-upgrade 4.升级 npm-upgrad ...