ES6之Set和Map数据结构

Set

Set类似于数组,但是和数组有着显著的区别:

  • 每个值唯一

为了确保Set中的值的唯一性,需要判断Set中的值是否相等,判断机制不同于‘===’,不同点在于Set中的NAN被视为相同的值。*早期草案中‘-0’和‘+0’为两个不同的值,现已被修正

  • 不会发生类型转换

·向Set中添加值得时候不会发生类型转换,采取上文相等的判断机制,需要注意的是两个对象总是不相等的。

set可接受一个可遍历对象(具有iterable接口的数据结构)作为参数生成:

var myArray = ["value1", "value2", "value3"];

// 用Set构造器将Array转换为Set
var mySet = new Set(myArray);

// 用...(展开操作符)操作符将Set转换为Array
console.log([...mySet]); //[ 'value1', 'value2', 'value3' ]

Set的属性和方法

属性

Set.prototype.constructor        构造函数,默认为Set函数

Set.prototype.size                      返回Set对象的值的个数

方法

add(value)                                 添加某个值,返回Set对象本身

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

has(value)                                  判断是否为Set的成员,返回一个布尔值

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

keys()                                         返回键名

values()                                      返回键值

entries()                                     返回键值对

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

WeakSet

WeakSet数据结构表示的是弱引用对象的集合。

与Set主要区别有两点:

  • Set中可以是值和对象,而WeakSet中的值只能是对象
  • 对象中存储的对象值都是被弱引用的

如果没有其他的变量或属性引用这个对象值, 则这个对象值会被当成垃圾回收掉. 正因为这样,WeakSet对象是无法被枚举的, 没有办法拿到它包含的所有元素.    

*因为不能被遍历,所以不存在WeakSet.prototype.size()和Weak.prototype.forEach方法,其他方法和Set类似。

Map

Map是一种类似于对象的数据结构,两者本质都是键值对的集合。

与Object的主要区别有:

  • Object的键只能是字符串,而Map可以为任意数据结构
  • Map 中的键值是有序的,而添加到对象中的键则不是。因此,当对它进行遍历时,Map 对象是按插入的顺序返回键值。
  • 你可以通过size属性直接获取一个Map的键值对个数,而Object的键值对个数只能手动计算。
  • Map可直接进行迭代,而Object的迭代需要先获取它的键数组,然后再进行迭代。
  • Object都有自己的原型,原型链上的键名有可能和你自己在对象上的设置的键名产生冲突。虽然 ES5 开始可以用map=Object.create(null)来创建一个没有原型的对象,但是这种用法不太常见。
  • Map在涉及频繁增删键值对的场景下会有些性能优势。

Map的属性和方法

属性

Map.prototype.constructor        构造函数,默认为Map函数

Map.prototype.size                     返回Map对象的值的个数

方法

set(key,value)                              设置键和值,返回Map对象本身

get(key)                                       返回键对应的值,如不存在,返回undefined

add(value)                                   添加某个值,返回Map对象本身

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

has(value)                                    判断是否为Map的成员,返回一个布尔值

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

keys()                                           返回键名

values()                                        返回键值

entries()                                      返回键值对

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

WeakMap

WeakMap与Map的区别:

  • WeakMap只接受对象作为键名(null除外)
  • WeakMap的键名所指向的对象不计入垃圾回收机制

WeakMap中,每个键对自己所引用对象的引用是 "弱引用", 这意味着,如果没有其他引用和该键引用同一个对象,这个对象将会被当作垃圾回收。原生 WeakMap 的结构是特殊且有效的,其用于映射的 key 只有在其没有被回收时才是有效的 。

*和WeakSet类似,WeakMap也是不可遍历的,其他方法和Map类似。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值