在javascript中,存储数据的方式大部分就是以数组或者对象形式存储的,es6出现了4种新集合Set,Map,WeakSet,WeakMap来存储数据,简化了编程。

集合--Set

类似于数组,但是成员的值都是唯一的,没有重复的值。通过Set集合可以快速访问其中的数据,更有效地追踪各种离散值
Set自身是个构造函数。使用 new 来生成 Set 数据结构
let arr = new Set([1,2,3,4,4,4])
console.log(arr) // Set(4) {1, 2, 3, 4}
console.log(Object.prototype.toString.call( arr)) // [object Set]
let obj = new Set({name:'peter'})
console.log(obj) // Uncaught TypeError: undefined is not a function
let str = new Set('abc')
console.log(str) // Set(3) {"a", "b", "c"}
由上述例子可知:Set中不存在重复的值,检测的类型不是object,是Set。
        不能操作对象,会报错,
        操作字符串会在内部转化成数组,再显示成Set结构。

可以利用Set的特性,可以对数组进行去重。

let arr = new Set([1,2,3,4,5,4,4,4,4])
console.log([...arr]) // [1, 2, 3, 4, 5]
console.log(Array.from(arr)) // [1, 2, 3, 4, 5]
向 Set 加入值的时候,不会发生类型转换,Set 内部判断两个值是否不同,使用的算法叫做“Same-value-zero equality”,和===相似,但不同的是NaN用Set之后相同

console.log(new Set([1,2,3,4,'4','3']))  // [1, 2, 3, 4, '4', '3']
let set = new Set();
set.add(NaN);
set.add(NaN);
console.log(set) // Set {NaN}

Set属性 -- size

来判断Set结构里的数量

let set = new Set([1,2,3,4])
console.log(set.size) //

Set实例的方法

add(value) 添加某个值,返回 Set 结构本身
let a = new Set()
a.add(2)
console.log(a) // Set(1) {2}
a.add(3)
a.add(2)
console.log(a.add(2)) // Set(2) {2, 3}
console.log(a) // Set(2) {2, 3}

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

let a = new Set([1,2,3])
console.log(a.delete(2)) // true
console.log(a.delete(5)) // false
console.log(a) // {1, 3}

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

let a = new Set([1,2,3])
console.log(a.has(1)) // true
console.log(a.has(4)) // false

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

let a = new Set([1,2,3,4])
console.log(a.clear()) // undefined
a.clear()
console.log(a) // Set(0) {}

关于遍历操作,对象的遍历操作也适用于Set,

  keys():返回键名的遍历器
  values():返回键值的遍历器
  ps: 由于Set结构没有键名键值之说,所以键名和键值的运算算同一个。
  entries():返回键值对的遍历器
  forEach():使用回调函数遍历每个成员
let set = new Set(['a', 'b', 'c'])
for( let i of set.keys()) {
console.log(i) // a b c
}
for( let i of set.entries()) {
console.log(i) // ["a", "a"] ["b", "b"] ["c", "c"]
}
 

集合--WeakSet 

也是一个数据结构,成员是唯一的,没有重复的。Set成员不能是对象,否则会报错,所以WeakSet就是为了操作成员对象形式的结构。
WeakSet 中的对象都是弱引用,即垃圾回收机制不考虑 WeakSet 对该对象的引用,也就是说,如果其他对象都不再引用该对象,那么垃圾回收机制会自动回收该对象所占用的内存,不考虑该对象还存在于 WeakSet 之中,所以WeakSet不可遍历。
因此,WeakSet 适合临时存放一组对象,以及存放跟对象绑定的信息。只要这些对象在外部消失,它在 WeakSet 里面的引用就会自动消失

和set一样,是个构造函数,用new来创建。和Set不同的是:因为不可遍历,所以没有size属性

const ws = new WeakSet();
console.log(ws) // WeakSet {} let ws = new WeakSet([[1,2,3,4],[5,6]])
console.log(ws) // WeakSet {Array(2), Array(4)}

WeakSet方法:

add(value) 向 WeakSet 实例添加一个新成员
let ws = new WeakSet();
ws.add({})
console.log(ws) // WeakSet {{…}}
delete(value) 清除 WeakSet 实例的指定成员。
let ws = new WeakSet();
let obj = {}
ws.add(obj)
ws.delete(obj)
console.log(ws) // WeakSet {}
has(value) 返回一个布尔值,表示某个值是否在 WeakSet 实例之中。

let ws = new WeakSet();
let obj = {}
let obj1 = {}
ws.add(obj)
console.log(ws.has(obj)) // true
console.log(ws.has(obj1)) // false

集合--Map

在js中对象是以键值对呈现的,但是键名必须是字符串,而不能是对象,数组,dom元素等等,为了解决这此困扰,es6引入了Map数据解构。
let map = new Map()
console.log(map) // Map(0) {}
Map 类似于对象,也是键值对的集合,但是“键”的范围不限于字符串,各种类型的值(包括对象)都可以当作键。

const map = new Map([
['name', 'peter'],
['age', '25']
]);
console.log(map) // Map(2) {"name" => "peter", "age" => "25"}

Map属性:

size 能够返回Map成员的数量

const map = new Map([
['name', 'peter'],
['age', '25']
]);
console.log(map.size) //

Map方法

和Set的方法一样

set(key, value) 设置键名key对应的键值为value,然后返回整个 Map 结构。如果key已经有值,则键值会被更新,否则就新生成该键。

ps:set方法返回的是当前的Map对象,因此可以采用链式写法。
let map = new Map();
map.set('name','peter').set('age', 25).set({color:'red'},'key')
console.log(map) // Map(3) {"name" => "peter", "age" => 25, {…} => "key"}
ps: 如果对同一个键多次赋值,后面的值将覆盖前面的值。
let map = new Map();
map.set('name','peter').set('name', 25).set('name','key')
console.log(map) // Map(1) {"name" => "key"}
ps: 如果对同一个键名是个对象形式,则代表不一样的值。
let map = new Map();
map.set({name:'peter'}, 1).set({name:'Peter'}, 2)
console.log(map) //Map(2) {{…} => 1, {…} => 2}

get(key) 读取key对应的键值,如果找不到key,返回undefined。

let map = new Map()
map.set('name','peter')
console.log(map.get('name')) // peter
console.log(map.get('age')) // undefined

has(key) 返回一个布尔值,表示某个键是否在当前 Map 对象之中

let map = new Map()
map.set('name','peter')
console.log(map.has('name')) // peter
console.log(map.has('age')) // false

delete(key) 删除某个键,返回true。如果删除失败,返回false

let map = new Map()
map.set('name','peter')
console.log(map) // Map(1) {"name" => "peter"}
console.log(map.delete('name')) // peter
console.log(map.delete('age')) // false
console.log(map) // Map(0) {}

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

let map = new Map()
map.set('name','peter')
console.log(map) // Map(1) {"name" => "peter"}
console.log(map.clear())
console.log(map) // Map(0) {}

关于遍历操作,对象的遍历操作也适用于Map

  keys():返回键名的遍历器。
  values():返回键值的遍历器。
  entries():返回所有成员的遍历器。
  forEach():遍历 Map 的所有成员。
 

集合--WeakMap

功能和Map一样,区别是WeakMap只能接受对象为键名,不接受其他类型的。
也和WeakSet一样,是弱类型对象,WeakMap集合中的键名必须是一个对象,如果使用非对象键名会报错;集合中保存的是这些对象的弱引用,如果在弱引用之外不存在其他的强引用,引擎的垃圾回收机制会自动回收这个对象,同时也会移除WeakMap集合中的键值对。但是只有集合的键名遵从这个规则,键名对应的值如果是一个对象,则保存的是对象的强引用,不会触发垃圾回收机制
WeakMap集合最大的用途是保存Web页面中的DOM元素,例如,一些为Web页面打造的JS库,会通过自定义的对象保存每一个引用的DOM元素

方法:

has() 检测给定的键在集合中是否存在;
get() 获取给定的键值
delete()可移除指定的键值对
不支持clear()

let key1 = {},
key2 = {},
map = new WeakMap([[key1, "Hello"], [key2, 42]]);
console.log(map.has(key1)); // true
console.log(map.get(key1)); // "Hello"
console.log(map.has(key2)); // true
console.log(map.get(key2)); //
console.log(map.delete(key2)) // true
console.log(map) // WeakMap {{…} => "Hello"}

对应的笔记和实例,我放到了GitHub,https://github.com/sqh17/notes

有什么问题请私信或留下评论,一起加油。

 
 
参考资料:
阮一峰大大的es6标准入门:http://es6.ruanyifeng.com

es6学习笔记--新数据结构Set,Map以及WeakSet,WeakMap的更多相关文章

  1. ES6学习笔记(10)----Set和Map数据结构

    参考书<ECMAScript 6入门>http://es6.ruanyifeng.com/ Set和Map数据结构 1.Set  基本用法    Set是一种新的数据结构,它的成员都是唯一 ...

  2. es6学习笔记8--Map数据结构

    Map Map结构的目的和基本用法 JavaScript的对象(Object),本质上是键值对的集合(Hash结构),但是只能用字符串当作键.这给它的使用带来了很大的限制. var data = {} ...

  3. es6学习笔记--新数据类型Symbol

    学习了es6语法的symbol类型,整理笔记,闲时复习. Symbol 是es6新增的第七种原始数据类型(null,string,number,undefined,boolean,object),是为 ...

  4. ES6 学习笔记(十)Map的基本用法

    1 基本用法 Map类型是键值对的有序列表,而键和值都可以是任意类型.可以看做Python中的字典(Dictionary)类型. 1.1 创建方法 Map本身是一个构造函数,用来生成Map实例,如: ...

  5. JS&ES6学习笔记(持续更新)

    ES6学习笔记(2019.7.29) 目录 ES6学习笔记(2019.7.29) let和const let let 基本用法 let 不存在变量提升 暂时性死区 不允许重复声明 块级作用域 级作用域 ...

  6. es6学习笔记-class之一概念

    前段时间复习了面向对象这一部分,其中提到在es6之前,Javasript是没有类的概念的,只从es6之后出现了类的概念和继承.于是乎,花时间学习一下class. 简介 JavaScript 语言中,生 ...

  7. ES6学习笔记<一> let const class extends super

    学习参考地址1  学习参考地址2 ECMAScript 6(以下简称ES6)是JavaScript语言的下一代标准.因为当前版本的ES6是在2015年发布的,所以又称ECMAScript 2015:也 ...

  8. ES6学习笔记之块级作用域

    ES6学习笔记:块级作用域 作用域分类 全局作用域 局部作用域 块级作用域 全局作用域示例 var i=2; for (var i = 0; i < 10; i++) { } console.l ...

  9. javaSE学习笔记(11)--- Map

    javaSE学习笔记(11)--- Map 1.Map集合 现实生活中,我们常会看到这样的一种集合:IP地址与主机名,身份证号与个人,系统用户名与系统用户对象等,这种一一对应的关系,就叫做映射.Jav ...

随机推荐

  1. ZOJ - 2477 dfs [kuangbin带你飞]专题二

    注意输入的处理,旋转操作打表.递增枚举可能步数,作为限制方便找到最短路. AC代码:90ms #include<cstdio> #include<cstring> char m ...

  2. Nginx 调优经验记录

    1.2017年连续爆出5.x版本xshell安全问题和intel的cpu设计漏洞 ,此时我就注意到尽量少暴露自己线上使用的工具以及版本.例如:mysql版本,以及缓存层策略,服务器版本等,以下为 隐藏 ...

  3. java遍历的优化

    说明:这是在面试中面试官出的题.虽然是常见的优化问题,但这种经验的确很有用.感慨之余,分享出来,以此共勉. 场景:现有List<PersonA>,List<PersonB>,P ...

  4. iOS.Animations.by.Tutorials.v2.0汉化(二)

    翻译自:iOS.Animations.by.Tutorials.v2.0 第一节(第1章) 动画属性 现在你已经看到了动画是多么的简单,你可能很想知道你的视图控件是怎么动起来的.本节将给你一个UIVi ...

  5. Redis实现数据库读写分离

    Redis简介 Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API.从2010年3月15日起,Redis的开发工作 ...

  6. Vue项目搭建及原理二

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; text-align: justify; font: 10.5px "Trebuchet MS"; ...

  7. ubuntu10.04 安装配置tftp服务

    tftpd-hpa 是一个功能增强的TFTP服务器.它提供了很多TFTP的增强功能,它已经被移植到大多数的现代UNIX系统. 1.安装 sudo apt-get install tftpd-hpa t ...

  8. Hi3531支持2GByte内存

    型号为K4B4G1646B-HCKO 1.修改DDRC_RNKCFG 为 0x142 2.修改arch/arm/mach-godnet/include/mach/vmalloc.h 扩大 vmallo ...

  9. FusionCharts 2D帕累托图

    1.了解帕累托图的特性以及和其他图的共性 2.设计帕累托图页面中引入图的类型以及怎么引入到页面 Pareto2D.html: <!DOCTYPE HTML PUBLIC "-//W3C ...

  10. R语言︱文件读入、读出一些方法罗列(批量xlsx文件、数据库、文本txt、文件夹)

    笔者寄语:小规模的读取数据的方法较为简单并且多样,但是,批量读取目前看到有以下几种方法:xlsx包.RODBC包.批量转化成csv后读入. R语言中还有一些其他较为普遍的读入,比如代码包,R文件,工作 ...