Map 和 WeakMap 数据结构
Map 和 WeakMap 是ES6 新增的数据结构
一、Map
它们本质与对象一样,都是键值对的集合,但是他们与 Object 对象主要的不同是,键可以是各种类型的数值,而Object 对象的键 只能是字符串类型或者Symbol类型值,Map 和 WeakMap 是更为完善的Hash结构。
1.对象 和 Map
//----------- 对象 --------------
var keyObj = {}
var dataObj = {}
dataObj[keyObj] = '大家好'
function studyEs6() {
let objKey1 = {}
let objKey2 = {}
let obj = new Object()
obj[objKey1] = 33 // 以对象做键
obj[objKey2] = 66
for(let key in obj){ // fo...in 循环,主要针对 object
console.log(key) // [object Object] 后面的覆盖掉前面的
}
}
虽然表面上看 dataObj 对象的键是对象 keyObj,其实不是,dataObj[keyObj] 会将 keyObj 转换为字符串 '[object Object]'
//------------- Map ------------
var mapData = new Map()
var objKey = {p: 'antzome'}
mapData.set(objKey,'对象键') // 添加新元素
console.log(mapData.get(objKey)) // 获取
console.log(mapData.has(objKey)) // 判断是否含有
console.log(mapData.delete(objKey)) // 删除键
mapData.clear() // 清空
function studyEs6() {
var mapData = new Map()
var objKey1 = {}
var objKey2 = {}
mapData.set(objKey1,'33') // 使用set方法,添加新元素
mapData.set(objKey2,'66') // 添加新元素
console.log(mapData.get(objKey1)) // 获取
console.log(mapData.has(objKey1)) // 判断是否含有
console.log(mapData.delete(objKey1)) // 删除键
mapData.clear() // 清空
}
2.数组作为构造函数参数
var mapData = new Map([['webName','百度'],['url','www.baidu.com']])
console.log(mapData.size)
console.log(mapData.has('webName'))
console.log(mapData.get('webName'))
console.log(mapData.has('url'))
console.log(mapData.get('url'))
构造函数参数为数组执行的是如下算法(数组的forEach方法)
forEach 方法将会以插入顺序对Map对象中的每一个键值对执行一次参数中提供的回调函数。
value: 可选,元素的值
key: 可选,元素的键
Map: 可选,当前的Map对象
thisArg: 可选,callback执行时其this的值
mapData.forEach(function(value,key){
console.log(value,key)
})
function studyEs6() {
var mapData = new Map([['webName','百度'],['url','www.baidu.com']])
var objKey1 = {}
var objKey2 = {}
mapData.set(objKey1,'33') // 使用set方法,添加新元素
mapData.set(objKey2,'66') // 添加新元素
console.log(mapData.get('webName'))
mapData.forEach(function(value,key){ // 第一是:值,第二个是:键
console.log(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.baidu.com']])
var arr = [...mapData]
console.log(arr)
//----------- for--of 循环 ---------------
var mapData = new Map([['webName','百度'],['url','www.baidu.com']])
for (let elem of mapData) {
console.log(elem) // 此处 elem 输一个数组形式的键值对
}
//----------- 其他函数 ------------------
var keyIterator = mapData.keys() // 键遍历器 console.log(keyIterator) var valueIterator = mapData.values() // 值遍历器 console.log(valueIterator.next().value) // 遍历器用法 (有几个,就需要 next 几次) console.log(valueIterator) var size = mapData.size() // 键值对数量 console.log(size)
二、WeakMap 数据结构
WeakMap 结构与 Map 结构基本类似。
区别是它只接受对象作为键名,不接受其他类型的值作为键名。键名是对象的弱引用,当对象被回收后,WeakMap 自动移除对应的键值对,WeakMap 结构有助于防止内存泄漏。
var wm = new WeakMap() var obj = new Object() wm.set(obj,'对象1') obj = null // 或 wm.delete(obj) console.log(wm.get(obj)) // undefined console.log(wm.has(obj)) // false
注:由于WeakMap 对象不可遍历,所以没有 size 属性
.
Map 和 WeakMap 数据结构的更多相关文章
- Map和WeakMap的区别
个人总结:在一个变量作用域中,如果结束到作用域结尾 } 的话,map中的引用会被垃圾回收机制回收的是weakmap ,map中的引用不会被垃圾回收机制回收的是map. 强引用:只要引用存在,垃圾回收器 ...
- ES6中Map与其他数据结构的互相转换
最近在学习ES6的基础知识,整理了一下Map与其他数据结构相互转换的写法. Map转为数组的方法 let myMap = new Map([[true, 7], [{foo: 3}, ['abc']] ...
- ES6新增的Map和WeakMap 又是什么玩意?非常详细的解释
上一篇文章讲了set和weakSet,这节咱就讲Map和weakMap是什么?这两篇文章并没有什么联系,主要知识用法类似而已.嘿嘿,是不是感觉舒服多了. 什么是Map 介绍什么是Map,就不得不说起O ...
- Map和WeakMap的方法和区别
Map Map是一组键值对的结构,具有极快的查找速度. 一.构造函数不同 let map = new Map(); let weakmap = new WeakMap(); 二.内置函数不同 Map的 ...
- ES6新特性:Javascript中的Map和WeakMap对象
Map对象 Map对象是一种有对应 键/值 对的对象, JS的Object也是 键/值 对的对象 : ES6中Map相对于Object对象有几个区别: 1:Object对象有原型, 也就是说他有默认的 ...
- ES6 中的 Set、Map 和 WeakMap
Set 是 ES6 新增的有序列表集合,它不会包含重复项. Set 支持 add(item) 方法,用来向 Set 添加任意类型的元素,如果已经添加过则自动忽略: has(item) 方法用来检测 S ...
- C++ map,set内部数据结构
1)Set是一种关联容器,它用于存储数据,并且能从一个数据集合中取出数据.它的每个元素的值必须唯一,而且系统会根据该值来自动将数据排序.每个元素的值不能直接被改变.[重点]内部结构采用红黑树的平衡二叉 ...
- Js基础知识7-Es6新增对象Map和set数据结构
前言 JavaScript中对象的本质是键值对的集合,ES5中的数据结构,主要是用Array和Object,但是键只能是字符串.为了弥补这种缺憾,ES6带来了一种新的数据结构Map. Map也是键值对 ...
- 纵横填字map版(初始数据结构)
新数据结构设计: 定义一个map: key是横纵坐标字符串,比如“0,4” value是一个json,包含以下属性:字,横向的词(若 有的话,无的话,空串),纵向的词(若有的话,无的话,空串). 另有 ...
随机推荐
- 「SCOI2014」方伯伯的商场之旅
「SCOI2014」方伯伯的商场之旅 题目描述 方伯伯有一天去参加一个商场举办的游戏.商场派了一些工作人员排成一行.每个人面前有几堆石子.说来也巧,位置在 \(i\) 的人面前的第 \(j\) 堆的石 ...
- hdu 3586 树形dp+二分
题目大意:给定n个敌方据点,1为司令部,其他点各有一条边相连构成一棵 树,每条边都有一个权值cost表示破坏这条边的费用,叶子节点为前线.现要切断前线和司令部的联系,每次切断边的费用不能超过上限lim ...
- 洛谷P4009 汽车加油行驶问题
题目描述 给定一个 N \times NN×N 的方形网格,设其左上角为起点◎,坐标(1,1)(1,1),XX 轴向右为正, YY 轴向下为正,每个方格边长为 11 ,如图所示. 一辆汽车从起点◎出发 ...
- web前端 -- 页面设计小技巧
1:进入网页时淡入淡出的效果. <meta http-equiv=”Page-Exit”; content=”blendTrans(Duration=1.0)”> 在头部head之间加入此 ...
- 编程经验(C#)
本文记录我在编程里学到的一些小技巧,遇到了就记录一下. 1.如果通用接口中的回调没有参数,而调用时需要参数,这个时候可以用匿名函数多封装一层.例如: Private void Main() { Fun ...
- win2003服务器装spl2008,打安全补丁后无法进入SQL Server Management Studio
解决方法就是:卸载垃圾的360安全卫士,用windows自带的更新工具更新系统补丁,就好了
- 用 C# 做人脸检测(基于EmguCV)
c#datagridmatlab人脸识别图像处理path 下载源码 准备工作(必须) 下载 EmguCV 傻瓜安装后,把 bin 目录添加到环境变量里去,比如安装在 X:\EmguCV\ 目录下,就 ...
- 两步改动CentOS主机名称
在CentOS系统中,改动主机名称的过程例如以下: 1. 改动network文件 编辑network文件.配置例如以下: vi /etc/sysconfig/network 配置 NETWORKING ...
- Java中的break和continue关键字使用总结
java中的break和continue关键字使用总结 一.作用和区别 break的作用是跳出当前循环块(for.while.do while)或程序块(switch).在循环块中的作用是跳出 ...
- Android学习进阶和IoC
1.成为Android高手一般分为六个阶段: 第一阶段:熟练掌握Java SE,尤其是对其内部类.线程.并发.网络编程等需要深入研究:熟练掌握基于HTTP协议的编程,清楚POST和GET等请求方式流程 ...