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类似。