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

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

(一)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);
复制代码

(二)WeakMap


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属性。  


作者:zhulin1028

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

相关文章
|
2天前
|
存储 JavaScript 索引
js开发:请解释什么是ES6的Map和Set,以及它们与普通对象和数组的区别。
ES6引入了Map和Set数据结构。Map的键可以是任意类型且有序,与对象的字符串或符号键不同;Set存储唯一值,无重复。两者皆可迭代,支持for...of循环。Map有get、set、has、delete等方法,Set有add、delete、has方法。示例展示了Map和Set的基本操作。
23 3
|
2天前
|
JavaScript 前端开发
ES6:什么是Symbol?
ES6:什么是Symbol?
21 1
|
1天前
|
JavaScript 前端开发 Java
ES6 逐点突破系列 -- Set Map,工作感悟,完美收官
ES6 逐点突破系列 -- Set Map,工作感悟,完美收官
|
2天前
|
存储 JavaScript
ES6+新特性-Symbol与Set/Map数据结构
ES6 引入了三种新的数据结构:Symbol、Set和Map。Symbol是唯一且不可变的值,常用于定义对象的独特属性;Set存储不重复值,适合数组去重;Map则是键值对集合,键可为任意类型,提供了更灵活的存储方式。这些新数据结构提供了更高效的操作手段,分别解决了属性命名冲突、数据去重和复杂键值对存储的问题。示例展示了如何使用Symbol、Set和Map进行基本操作。
|
2天前
|
存储 前端开发 索引
【Web 前端】ES6中,Set和Map的区别 ?
【5月更文挑战第1天】【Web 前端】ES6中,Set和Map的区别 ?
|
2天前
|
JavaScript
js开发:请解释什么是ES6的Symbol,以及它的用途。
ES6的Symbol数据类型创建唯一值,常用于对象属性键(防冲突)和私有属性。示例展示了如何创建及使用Symbol:即使描述相同,两个Symbol也不等;作为对象属性如`obj[symbol1] = 'value1'`;也可作枚举值,如`Color.RED = Symbol('red')`。
|
2天前
|
存储 数据格式
Set和Map的应用场景
Set和Map的应用场景
|
1天前
|
存储 缓存 JavaScript
JavaScript中的Set和Map:理解与使用
JavaScript中的Set和Map:理解与使用