博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
es6 Map,Set 和 WeakMap,WeakSet
阅读量:6641 次
发布时间:2019-06-25

本文共 1667 字,大约阅读时间需要 5 分钟。

这些是新加的集合类型,提供了更加方便的获取属性值的方法,不用像以前一样用hasOwnProperty来检查某个属性是属于原型链上的呢还是当前对象的。同时,在进行属性值添加与获取时有专门的get,set 方法。

// Setsvar s = new Set();s.add("hello").add("goodbye").add("hello");s.size === 2;s.has("hello") === true;// Mapsvar m = new Map();m.set("hello", 42);m.set(s, 34);m.get(s) == 34;// Weak Mapsvar wm = new WeakMap();wm.set(s, { extra: 42 });wm.size === undefined// Weak Setsvar ws = new WeakSet();ws.add({ data: 42 });// Because the added object has no other references, it will not be held in the set

 

一、Map

Map解决的是Object的键值对中键只能是字符串的问题。

Map是Es6提供的新的数据结构,是键值对的集合。Map的“键”不限于字符串。各种类型的值(包括对象)都可以当做键。

 

Map的遍历

let map=new Map([['F','no'],['T','yes']]);for(let key of map.keys()){    console.log(key);} //F//Tmap.keys();//MapIterator {"F", "T"}map.values()//MapIterator {"no", "true"}for(let value of map.values()){    console.log(value);}//no//yesfor(let [key,value] of map.entries()){    console.log(key,value);}//F no//T yes

Map转数组

var m=new Map([    [1,"one"],    [2,"two"],    [3,"three"]])m.keys()//MapIterator {1, 2, 3}[...m.keys()]//[1, 2, 3]m.values()//MapIterator {"one", "two", "three"}[...m.values()]//["one", "two", "three"]m.entries()//MapIterator {[1, "one"], [2, "two"], [3, "three"]}[...m.entries()]//[Array[2], Array[2], Array[2]][...m]//[Array[2], Array[2], Array[2]]

二、WeakMap

 WeakMap结构与Map结构基本类似,唯一的区别就是WeakMap只接受对象作为键名(null除外),而且键名所指向的对象不计入垃圾回收机制。

WeakMap专用场景:

它的键所对应的对象可能会在将来消失。

典型应用:

一个对应DOM元素的WeakMap结构,当某个DOM元素被清除,其所对应的WeakMap记录就会自动被移除。

 

有时候我们会把对象作为一个对象的键用来存放属性值,普通集合类型比如简单对象会阻止垃圾回收器对这些作为属性键存在的对象的回收,有造成内存泄漏的危险。而WeakMap,WeakSet则更加安全些,这些作为属性键的对象如果没有别的变量在引用它们,则会被回收释放掉。

 

 

参考:

 

本文作者,因知识本身在变化,作者也在不断学习成长,文章内容也不定时更新,为避免误导读者,方便追根溯源,请诸位转载注明出处:有问题欢迎与我讨论,共同进步。

你可能感兴趣的文章
Linux 学习
查看>>
高一函数中易混的问题
查看>>
程序员的自我修养(2)——计算机网络(转) good
查看>>
HYSBZ 1588 营业额统计
查看>>
关于文字过长时进行省略问题
查看>>
单例模式的四种方式
查看>>
Redis客户端ServiceStack.Redis的简单使用
查看>>
PCA主成份分析学习记要
查看>>
[链接地址] Kafka设计解析
查看>>
Spring Cloud 分布式链路跟踪 Sleuth + Zipkin + Elasticsearch【Finchley 版】
查看>>
django视图001
查看>>
第一章Accp 8.0
查看>>
基于BootStrap的initupload()实现Excel上传和获取excel中的数据
查看>>
新增 修改,对xx名字或者其他属性做校验判断是否存在
查看>>
EF6 在原有数据库中使用 CodeFirst 总复习(一、搭建基础环境)
查看>>
MySQL性能优化小结
查看>>
Spring+SpringMVC+MyBatis)
查看>>
BZOJ-2190: [SDOI2008]仪仗队 (欧拉函数)
查看>>
浅谈 .NET 中的对象引用、非托管指针和托管指针
查看>>
[ASP.NET MVC 小牛之路]15 - Model Binding
查看>>