ES6新特性:Symbols 数据类型,集合对象Set Map


7.Symbols 数据类型


它是JavaScript的第七种原始类型
1997年JavaScript首次被标准化,那时只有六种原始类型,在ES6以前,JS程序中使用的每一个值都是以下几种类型之一:

Undefined 未定义
Null 空值
Boolean 布尔类型
Number 数字类型
String 字符串类型
Object 对象类型

 

var obj = new Map();
for (var i = 0; i < 100; i++) {
var mySymbol = Symbol();
obj[mySymbol] = "ok!"; // 保证不会冲突

}
console.log(obj); // ok!
console.log(obj.keys()); // ok!

 

 


8.集合对象Set Map
8.1 Set:
一个Set是一群值的集合。它是可变的,能够增删元素.
一个Set不会包含相同元素。试图再次加入一个已有元素不会产生任何效果。(对象类型除外)


以下是Set支持的所有操作:

new Set:创建一个新的、空的Set。
new Set(iterable):从任何可遍历数据中提取元素,构造出一个新的集合。
set.size:获取集合的大小,即其中元素的个数。
set.has(value):判定集合中是否含有指定元素,返回一个布尔值。
set.add(value):添加元素。如果与已有重复,则不产生效果。
set.delete(value):删除元素。如果并不存在,则不产生效果。.add()和.delete()都会返回集合自身,所以我们可以用链式语
法。
set[Symbol.iterator]():返回一个新的遍历整个集合的迭代器。一般这个方法不会被直接调用,因为实际上就是它使集合能够
被遍历,也就是说,我们可以直接写for (v of set) {...}等等。
set.forEach(f):直接用代码来解释好了,它就像是for (let value of set) { f(value, value, set); }的简写,类似于数
组的.forEach()方法。
set.clear():清空集合。
set.keys()、set.values()和set.entries()返回各种迭代器,它们是为了兼容Map而提供的,所以我们待会儿再来看。

 

var set1 = new Set;
set1.add({name:"lili",age:1}); 
set1.add({ name: "lili", age: 1 }); // 它们一样么?
console.log(set1.size); // 2

 

 

8.2 Map
一个Map对象由若干键值对组成,支持:

new Map:返回一个新的、空的Map。
new Map(pairs):根据所含元素形如[key, value]的数组pairs来创建一个新的Map。这里提供的pairs可以是一个已有的Map 对
象,可以是一个由二元数组组成的数组,也可以是逐个生成二元数组的一个生成器,等等。
map.size:返回Map中项目的个数。
map.has(key):测试一个键名是否存在,类似key in obj。
map.get(key):返回一个键名对应的值,若键名不存在则返回undefined,类似obj[key]。
map.set(key, value):添加一对新的键值对,如果键名已存在就覆盖。
map.delete(key):按键名删除一项,类似delete obj[key]。
map.clear():清空Map。
map[Symbol.iterator]():返回遍历所有项的迭代器,每项用一个键和值组成的二元数组表示。
map.forEach(f) 类似for (let [key, value] of map) { f(value, key, map); }。这里诡异的参数顺序,和Set中一样,是
对应着Array.prototype.forEach()。
map.keys():返回遍历所有键的迭代器。
map.values():返回遍历所有值的迭代器。
map.entries():返回遍历所有项的迭代器,就像map[Symbol.iterator]()。实际上,它们就是同一个方法,不同名字。

let map1 = new Map();
map1.set("1", "2")
for (let data of map1) {
console.log(data);
}
//Array(2)
//0: "1"
//1: "2"
//length: 2
//__proto__: Array(0)
 

map1.set("", "3")
map1.set(null, "4")
map1.set(undefined, "5")
console.log(map1);

//Map(4)
//[[Entries]]
//0: {"1" => "2"}
//1: {"" => "3"}
//2: {null => "4"}
//3: {undefined => "5"}
//size: (...)
//__proto__: Map

 

8.3 WeakMap和WeakSet
WeakMap和WeakSet被设计来完成与Map、Set几乎一样的行为,除了以下一些限制:

WeakMap只支持new、has、get、set 和delete。
WeakSet只支持new、has、add和delete。
WeakSet的值和WeakMap的键必须是对象。
还要注意,这两种弱集合都不可迭代,除非专门查询或给出你感兴趣的键,否则不能获得一个弱集合中的项。

这些小心设计的限制让垃圾回收机制能回收仍在使用中的弱集合里的无效对象。这效果类似于弱引用或弱键字典,但ES6的弱集合
可以在不暴露脚本中正在垃圾回收的前提下得到垃圾回收的效益。

 

posted @ 2020-07-22 16:20  越过那个限制  阅读(190)  评论(0编辑  收藏  举报