ES6新特性(3)之Symbol/Set/WeakSet

99 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第5天,点击查看活动详情

(一)Map

Map和weakmap它们本质与对象一样,都是键值对的集合,但是他们与Object对象主要的不同是,键可以是各种类型的数值,而若键是Object类型,那么只能是字符串类型或者Symbol类型值。Map和WeakMap是更为完善的Hash结构。

1.对象和Map

//---------对象---------------------------

var keyObj = {};

var dataObj = {};

dataObj[keyObj] = "大脚好";

虽然表面上看dataObj对象的键是对象keyObj,其实不是,dataObj[keyObj]会将keyObj转换转为字符串"[object Object]"。

//----------Map----------------------------

var mapData = new Map();

var objKey = {p: "antzone"};

mapData.set(objKey, "对象键");    //添加新元素

console.log(mapData.get(objKey)); //获取对应key的value 

console.log(mapData.has(objKey));  //判断是否含有

console.log(mapData.delete(objKey)); //删除键值对

mapData.clear();    //清空

2.数组作为构造函数参数

var mapData = new Map([

["webName", "资源库"],

["url", "www.yuankuwang.com"]

]);

console.log(mapData.size);//2

console.log(mapData.has("webName"));//true

console.log(mapData.get("webName"));//资源库

console.log(mapData.has("url"));//true

console.log(mapData.get("url"));//www.yuankuwang.com

构造函数参数为数组执行的是如下算法(数组的forEach方法)

forEach方法将会以插入顺序对Map对象中的每一个键值对执行一次参数中提供的回调函数。

value:可选,元素的值。

key:可选,元素的键。

Map:可选,当前的Map对象。

thisArg:可选,callback执行时其this的值。  

mapData.forEach(function (value,key) {

  console.log(value,key);

})

var arr = [["webName", "资源库"], ["url", "www.yuankuwang.com"]];

var mapData = new Map();

arr.forEach(([key, value]) => mapData.set(key, value));

3.由于Map对象的键可以是对象,所以只有对同一个对象的引用,Map对象才将其视为同一个键。

NaN不严格相等于自身,但Map将其视为同一个键

let mapData = new Map();

mapData.set(NaN, 5);

console.log(mapData.get(NaN));

mapData.set(-0, 5);

console.log(mapData.get(+0));

4.Map遍历

//---------转成数组-----------

var mapData = new Map([["webName", "资源库"], ["url", "www.yuankuwang.com"]]);

var arr = [...mapData];

console.log(arr);

//---------for--of循环--------

var mapData = new Map([["webName", "资源库"], ["url", "www.yuankuwang.com"]]);

for(let elem of mapData) {

  console.log(elem);

}

//----------其他函数-------------

var keyIterator = mapData.keys();//键遍历器

console.log(keyIterator);

var valueIterator = mapData.values();  //值遍历器

console.log(keyIterator.next());   //遍历器用法

console.log(valueIterator);

var size = mapData.size;      //键值对数量

console.log(size);

(二)W eakMap

WeakMap结构与Map结构基本类似。

区别:是它只接受对象作为键名,不接受其他类型的值作为键名。键名是对象的弱引用,当对象被回收后,WeakMap自动移除对应的键值对,WeakMap结构有助于防止内存泄漏。

var wm = new WeakMap(); //只能放object的键

var obj = new Object();

wm.set(obj, '对象1');

// wm.delete(obj);

obj = null; //效果和delete的效果一样

console.log(wm.get(obj)); //undefined

console.log(wm.has(obj)); //false  

由于WeakMap对象不可遍历,所以没有size属性。