es6学习笔记3:Set和Map数据结构

  • Post author:
  • Post category:其他


1.Set

ES6 提供了新的数据结构 Set。它类似于数组,但是

成员的值都是唯一的



没有重复的值。

Set本身是一个构造函数,用来生成Set数据结构 const s=

new Set()

;它可以接受一个

数组

(或者具有iterable接口的其他数据结构)

作为参数,用来初始化

Set 内部判断两个值是否不同,它类似于

精确相等运算符(

===



,主要的区别是


NaN

等于自身

另外两个对象总是不相等的。

Set实例的属性和方法:

属性:

Set.prototype.

constructor


:构造函数,默认就是

Set

函数


Set.prototype.

size


:返回

Set

实例的成员总数

方法:

操作方法

(用于操作数据)和

遍历方法

(用于遍历成员)

操作方法:


add(value)


:添加某个值,返回 Set 结构本身



delete(value)


:删除某个值,返回一个布尔值,表示删除是否成功



has(value)


:返回一个布尔值,表示该值是否为

Set

的成员



clear()


:清除所有成员,没有返回值

Array.from方法可以将Set结构转为数组 (数组去重)

//数组array去重
Array.from(new Set(array))
[...new Set(arr)]
//字符串s去重
[...new Set(s)].join('')

遍历方法(Set 结构的实例有四个遍历方法,可以用于遍历成员,遍历顺序就是插入顺序):



keys()


:返回键名的遍历器



values()


:返回键值的遍历器



entries()


:返回键值对的遍历器,每次输出一个数组[“red”,”red”]



forEach()


:使用回调函数遍历每个成员,用于对每个成员执行某种操作,没有返回值

由于Set结构没有键名,只有键值(或者说键名和键值是同一个值)即keys和values方法行为一致

Set 结构的实例默认可遍历,它的默认遍历器生成函数就是它的

values

方法,意味着,可以省略values方法,直接用

for。。。of

循环遍历Set

遍历的应用:

扩展运算符(…)

内部使用for…of循环,也可以用于Set结构

[…set]

将去重后的set变成数组了

,从而

数组的map和filter方法

也可以间接用于Set了,因此使用set可以很容易地实现

并集、交集和差集

如果想在遍历操作中,同步改变原来的 Set 结构,目前没有直接的方法,但有两种变通方法。一种是利用原 Set 结构映射出一个新的结构,然后赋值给原来的 Set 结构;另一种是利用

Array.from

方法。


2.WeakSet

WeakSet结构,也是

不重复的值的集合

,但是里面成员

只能是对象

。WeakSet中的对象都是弱引用,即垃圾回收机制不考虑WeakSet对该对象的引用。

WeakSet 适合临时存放一组对象



以及存放跟对象绑定的信息

。只要这些对象在外部消失,它在 WeakSet 里面的引用就会自动消失。不可遍历。

WeakSet 是一个构造函数,可以使用

new

命令,创建 WeakSet 数据结构。(数组的成员成为WeakSet的成员,而不是a数组本身,意味着

数组的成员只能是对象

三个方法:


  • WeakSet.prototype.add(value)

    :向 WeakSet 实例添加一个新成员。

  • WeakSet.prototype.delete(value)

    :清除 WeakSet 实例的指定成员。

  • WeakSet.prototype.has(value)

    :返回一个布尔值,表示某个值是否在 WeakSet 实例之中。

WeakSet 不能遍历,是因为成员都是弱引用,随时可能消失。WeakSet 的一个用处,是

储存 DOM 节点

,而不用担心这些节点从文档移除时,会引发内存泄漏。


3.Map

javascript的对象,本质是

键值对的集合

(hash结构),但是传统上

只能用字符串当作键

ES6 提供了 Map 数据结构。它类似于对象,也是键值对的集合,

但是“键”的范围不限于字符串



各种类型的值(包括对象)都可以当作键

(Object 结构提供了“字符串—值”的对应,Map 结构提供了“值—值”的对应)

作为构造函数,Map 也可以接受

一个数组

作为参数。该

数组的成员是一个个表示键值对的数组

不仅仅是数组,任何具有 Iterator 接口、且每个成员都是一个双元素的数组的数据结构(即可以使用

Set 对象和 Map 对象

,当作

Map

构造函数的参数,结果都生成了新的 Map 对象。)

同一个键多次赋值,后面的值将

覆盖前面的值

;读取一个

未知的键,则返回

undefined

Map 的键实际上是跟

内存地址

绑定的,只要内存地址不一样,就视为

两个键

如果 Map 的键是一个

简单类型的值(数字、字符串、布尔值)

,则只要两个值

严格相等

,Map 将其视为一个键(NAN除外)

Map结构的

实例属性

和操作方法。

1.

size属性

返回Map结构的成员总数

2.

set(key,value)

set方法设置键名key对应的键值为value,然后返回整个Map结构

3.

get(key)

读取key对应的键值,若没有则返回undefined

4.

has(key)

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

5.

delete(key)

删除某个键 返回true或者false

6.

clear()

清除所有成员,没有返回值


遍历方法

(Map结构原生提供三个遍历器生成函数和一个遍历方法)

1.

keys()

返回键名的遍历器

2.

values()

返回键值的遍历器

3.

entires()

返回所有成员的遍历器

4.

forEach()

遍历Map的所有成员 可以接受第二个参数用来绑定this

Map 结构转为数组结构,比较快速的方法是使用

扩展运算符(

...



结合

数组的

map

方法、

filter

方法

,可以实现 Map 的

遍历和过滤

(Map 本身没有

map



filter

方法)。


与其他数据结构的互相转换:

Map转为数组 扩展运算符(…)

数组转为Map 将数组传入Map构造函数

Map 转为对象 如果所有的Map的键都是字符串,它可以无损地转为对象

对象转为Map 其中有个Object.keys(obj)有点不理解,为何不直接obj.keys()

Map转JSON  Map的键名都是字符串,先转为对象,然后再用JSON.stringify;Map 的键名有非字符串,先转为数组,然后再用JSON.stringify

JSON转为Map ‘{“yes”:true,”no”:false}’先用JSON.parse(),然后再由对象转Map。若JSON就是一个数组,先用JSON.parse(),在传入new Map中当做参数。


4.WeekMap

和Map的区别:


WeakMap


只接受对象作为键名



null

除外),不接受其他类型的值作为键名


WeakMap

的键名所指向的对象,不计入垃圾回收机制(

只要所引用的对象的其他引用都被清除,WeakMap里面的键名对象所对应的键值对会自动消失,不用手动删除引用


WeakMap

的专用场合就是,它的

键所对应的对象,可能会在将来消失



WeakMap

结构有助于

防止内存泄漏

WeakMap 弱引用的只是键名,而不是键值。

键值依然是正常引用

。键值

obj

是正常引用。所以,即使在 WeakMap 外部消除了

obj

的引用,WeakMap 内部的引用依然存在。



WeakMap

只有四个方法可用:

get()



set()



has()



delete()


WeakMap的用途:


DOM 节点作为键名;部署私有属性



版权声明:本文为weixin_43160613原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。