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

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

相关文章
|
3月前
|
存储 Java 数据处理
Java Set接口凭借其独特的“不重复”特性,在集合框架中占据重要地位
【10月更文挑战第16天】Java Set接口凭借其独特的“不重复”特性,在集合框架中占据重要地位。本文通过快速去重和高效查找两个案例,展示了Set如何简化数据处理流程,提升代码效率。使用HashSet可轻松实现数据去重,而contains方法则提供了快速查找的功能,彰显了Set在处理大量数据时的优势。
47 2
|
3月前
|
存储 算法 Java
解析HashSet的工作原理,揭示Set如何利用哈希算法和equals()方法确保元素唯一性,并通过示例代码展示了其“无重复”特性的具体应用
在Java中,Set接口以其独特的“无重复”特性脱颖而出。本文通过解析HashSet的工作原理,揭示Set如何利用哈希算法和equals()方法确保元素唯一性,并通过示例代码展示了其“无重复”特性的具体应用。
73 3
|
3月前
|
存储 算法 Java
Java Set因其“无重复”特性在集合框架中独树一帜
【10月更文挑战第14天】Java Set因其“无重复”特性在集合框架中独树一帜。本文深入解析Set接口及其主要实现类(如HashSet、TreeSet)如何通过特定的数据结构(哈希表、红黑树)确保元素唯一性,并提供最佳实践建议,包括选择合适的Set实现类和正确实现自定义对象的`hashCode()`与`equals()`方法。
42 3
|
2月前
|
设计模式 JavaScript 前端开发
es6加上symbol的基础数据类型
【10月更文挑战第30天】ES6 中的 `Symbol` 作为一种新的基础数据类型,为 JavaScript 提供了一种创建唯一标识符和处理对象属性名冲突的有效方式,丰富了 JavaScript 的数据类型体系和编程模式,在实际开发中具有重要的应用价值。
|
2月前
|
设计模式 JavaScript 前端开发
es6加上symbol的基础数据类型
【10月更文挑战第22天】ES6中的 `Symbol` 作为一种新的基础数据类型,为JavaScript提供了一种创建唯一标识符和处理对象属性名冲突的有效方式,丰富了JavaScript的数据类型体系和编程模式,在实际开发中具有重要的应用价值。
|
3月前
|
Java 开发者
在Java的集合世界里,Set以其独特的特性脱颖而出,它通过“哈希魔法”和“红黑树防御”两大绝技
【10月更文挑战第13天】在Java的集合世界里,Set以其独特的特性脱颖而出。它通过“哈希魔法”和“红黑树防御”两大绝技,有效抵御重复元素的侵扰,确保集合的纯洁性和有序性。无论是“人海战术”还是“偷梁换柱”,Set都能从容应对,成为开发者手中不可或缺的利器。
43 6
|
3月前
|
Java 开发者
在Java集合世界中,Set以其独特的特性脱颖而出,专门应对重复元素
在Java集合世界中,Set以其独特的特性脱颖而出,专门应对重复元素。通过哈希表和红黑树两种模式,Set能够高效地识别并拒绝重复元素的入侵,确保集合的纯净。无论是HashSet还是TreeSet,都能在不同的场景下发挥出色的表现,成为开发者手中的利器。
33 2
|
3月前
|
Java
Java Set以其“不重复”的特性,为我们提供了一个高效、简洁的处理唯一性约束数据的方式。
【10月更文挑战第16天】在Java编程中,Set接口确保集合中没有重复元素,每个元素都是独一无二的。HashSet基于哈希表实现,提供高效的添加、删除和查找操作;TreeSet则基于红黑树实现,不仅去重还能自动排序。通过这两个实现类,我们可以轻松处理需要唯一性约束的数据,提升代码质量和效率。
47 2
|
3月前
|
存储 Java 数据处理
在Java集合框架中,Set接口以其独特的“不重复”特性脱颖而出
【10月更文挑战第14天】在Java集合框架中,Set接口以其独特的“不重复”特性脱颖而出。本文通过两个案例展示了Set的实用性和高效性:快速去重和高效查找。通过将列表转换为HashSet,可以轻松实现去重;而Set的contains方法则提供了快速的元素查找功能。这些特性使Set成为处理大量数据时的利器。
25 4
|
3月前
|
存储 Java 数据处理
Java中的Set接口以其独特的“不重复”特性,在集合框架中占据重要地位。
【10月更文挑战第13天】Java中的Set接口以其独特的“不重复”特性,在集合框架中占据重要地位。本文通过两个案例展示了Set的实用性和高效性:快速去重和高效查找。通过将列表转换为HashSet,可以轻松实现去重;而Set的contains方法则提供了高效的元素查找功能。这些特性使Set在处理大量数据时表现出色,值得我们在日常编程中充分利用。
48 3