Map与WeakMap Map对象用来保存键值对,并且能够记住键的原始插入顺序,任何对象或者原始值都可以作为键或者是值。...== NaN But key(NaN) === key(NaN)"} WeakMap 描述 WeakMap的key只能是Object类型,原始数据类型不能作为key。...WeakMap持有的是每个键对象的弱引用,这意味着在没有其他引用存在时垃圾回收能正确进行,WeakMap用于映射的key只有在其没有被回收时才是有效的,正由于弱引用,WeakMap的key是不可枚举的,...如果需要在对象上添加对象而又不想干扰垃圾回收机制的话,就可以使用WeakMap。 属性与方法 WeakMap.prototype.constructor: 返回构造函数。...WeakMap.prototype.set(key, value): 在WeakMap中设置一组key关联对象,返回这个 WeakMap对象。
可以使用二维数组初始化一个map,如:图片二、WeakMap与Map对比a. WeakMap的key必须是对象,否则报错b....WeakMap不可迭代,但可以使用map.set()、map.has()、map.delete()方法,但没有get方法c....WeakMap是弱引用,垃圾回收时,如果手动清理引用,会造成WeakMap的数据丢失,但Map不会,如:图片图片上图可知,当obj被GC回收后,Map将继续保持引用,但WeakMap却造成了数据丢失。...不可使用二维数组初始化WeakMap三、Set与Map对比a....Set也是使用for-of进行迭代四、WeakSet与Set基本上和WeakMap一致,但WeakSet没有get方法图片
(箭头函数获取不到this,你懂的) map map对象保存键值对,任何值都可以作为一个键或一个值 操作方法 set(key,value):添加元素 get(key):通过key获取value...对象存储对象是弱引用的,对象会被垃圾回收机制回收掉 操作方法 add(value):添加元素,元素类型为引用类型 has(value):判断是否包含某个元素 delete(value):删除某个value WeakMap...weakMap对象是一组键值对的集合,其中键是弱引用,所以键不可以为基本数据类型,必需是引用类型,值可以为任意值 操作方法 has(key):是否存在某个键 get(key):通过key值获取value
Map.png ES6里除了增加了Set(集合类型)外,笔者在这篇文章《Set与WeakSet》有过介绍,今天这篇文章将介绍引入的新类型——Map(映射类型)及WeakMap。...本篇文章将从以下方面进行介绍: Map代码示例 Map常用方法示例 Map与Object的区别 weakMap介绍 本篇文章阅读时间预计5分钟 Map代码示例 Map的键和值可以是任何数据类型,键值对按照插入顺序排列...以下三点是Map和WeakMap的主要区别: 1.Map对象的键可以是任何类型,但WeakMap对象中的键只能是对象引用 2.WeakMap不能包含无引用的对象,否则会被自动清除出集合(垃圾回收机制)。...下段代码示例验证了WeakMap的以上特性: let weakmap = new WeakMap(); (function(){ let o = {n: 1}; weakmap.set(o,...WeakMap相对于Map是一个不可枚举的对象,必须使用对象作为键值。如何更好的使用Map和WeakMap还需要具体结合我们实际的业务场景进行灵活使用。
引言--Set、Map、WeakSet和WeakMap是ES6引入的新的数据结构,它们在处理数据时具有不同的特性和用途。...缺点相对于对象,Map的性能稍差。使用场景存储和查找数据:可以使用Map来存储和查找数据,键值对的形式更加直观和灵活。...// 存储和查找数据const map = new Map();map.set('name', 'John');map.set('age', 30);console.log(map.get('name'...没有迭代器,不能遍历其中的键值对总结--通过以上代码示例,我们可以看到Set、Map、WeakSet和WeakMap的用法和特性。...另外,由于弱引用关联的特性,WeakSet和WeakMap没有提供像Set和Map那样的迭代器方法来遍历元素。也没有size属性来获取元素个数。这是为了确保不会干扰垃圾回收机制对对象的处理。
本篇文章将从以下方面进行介绍: Map代码示例 Map常用方法示例 Map与Object的区别 weakMap介绍 本篇文章阅读时间预计5分钟 01 Map代码示例 Map的键和值可以是任何数据类型,键值对按照插入顺序排列...以下三点是Map和WeakMap的主要区别: Map对象的键可以是任何类型,但WeakMap对象中的键只能是对象引用 WeakMap不能包含无引用的对象,否则会被自动清除出集合(垃圾回收机制)。...下段代码示例验证了WeakMap的以上特性: let weakmap = new WeakMap(); (function(){ let o = {n: 1}; weakmap.set(...(weakmap.get(s)); console.log(...weakmap); // exception thrown weakmap.delete(s); weakmap.clear(); //...WeakMap相对于Map是一个不可枚举的对象,必须使用对象作为键值。如何更好的使用Map和WeakMap还需要具体结合我们实际的业务场景进行灵活使用。
let map = new Map(); map.set(-0, 123); map.get(+0) // 123 map.set(true, 1); map.set('true', 2); map.get...WeakMap WeakMap 对象是一组键值对的集合,其中的键是弱引用对象,而值可以是任意。 注意,WeakMap 弱引用的只是键名,而不是键值。键值依然是正常引用。...WeakMap 中,每个键对自己所引用对象的引用都是弱引用,在没有其他引用和该键引用同一对象,这个对象将会被垃圾回收(相应的key则变成无效的),所以,WeakMap 的 key 是不可枚举的。...key关联对象 delete(key):移除 key 的关联对象 let myElement = document.getElementById('logo'); let myWeakmap = new WeakMap...本质上是键值对的集合,类似集合 可以遍历,方法很多可以跟各种数据格式转换 WeakMap 只接受对象作为键名(null除外),不接受其他类型的值作为键名 键名是弱引用,键值可以是任意的,键名所指向的对象可以被垃圾回收
在阅读红宝书时遇到了 WeakMap 这个关键字,第一次见感觉没啥用,是我见识浅了,其实还是有点用的,有多大我不知道(快跑) 希望这一篇文章能让你对 Map 有更好的理解,或者能够帮你理解 Map...和 WeakMap 这篇文章会先从Map再到WeakMap 一、为什么是 Map ?...obj[k] = v } 对象转为 Map for( let k of Object.keys(obj)){ map.set(k,obj[k]) } 五、什么是 WeakMap ?...已经有了一定的答案 七、Map 和 WeakMap 的区别 看到这里相信心中已经有答案了 Map 的键可以是任意类型,WeakMap 只接受对象作为键(null除外),不接受其他类型的值作为键...Map 的键实际上是跟内存地址绑定的,只要内存地址不一样,就视为两个键; WeakMap 的键是弱引用,键所指向的对象可以被垃圾回收,此时键是无效的 Map 可以被遍历, WeakMap 不能被遍历
什么是WeakMap WeakMap结构与Map结构类似,也是用于生成键值对的集合。...new WeakMap([[k1, 'foo'], [k2, 'bar']]); wm2.get(k2) // "bar" WeakMap与Map的区别 首先,WeakMap只接受对象作为键名(null...const map = new WeakMap(); map.set(1, 2) // TypeError: 1 is not an object!...map.set(Symbol(), 2) // TypeError: Invalid value used as weak map key map.set(null, 2) // TypeError:...WeakMap 的语法 WeakMap 与 Map 在 API 上的区别主要是两个,一是没有遍历操作(即没有keys()、values()和entries()方法),也没有size属性。
Map(3) {1 => "one", 2 => "two", true => "okk"} 二、WeakMap 1、WeakMap 的基本用法 WeakMap 的设计目的在于,键名是对象的弱引用(垃圾回收机制不将该引用考虑在内...基本上,WeakMap 的专用场合就是,它的键所对应的对象,可能会在将来消失,因此 WeakMap 结构有助于防止内存泄漏 下面是 WeakMap 结构的一个例子: var wm = new WeakMap...实例 我们将一个 DOM 节点 div1 作为键名,然后销毁这个节点,div1 对应的键就自动消失了,再引用这个键名就返回 undefined 2、WeakMap 与 Map 的区别 ① WeakMap...的键名,都会报错,因为不是对象 ② WeakMap 没有 size 属性 ③ WeakMap 没有遍历操作 WeakMap 没有 key()、values() 和 entries() 方法,而且无法清空...(即不支持 clear 方法),这与 WeakMap 的键不被计入引用、被垃圾回收机制忽略有关 3、WeakMap 实例的操作方法 除了没有 clear() 方法,其它跟 Map 一样,都含有 get(
ECMAScript 6 新增的“弱映射”(WeakMap)是一种新的集合类型,为这门语言带来了增强的键/值对存储机制。WeakMap 是 Map 的“兄弟”类型,其 API 也是 Map 的子集。...WeakMap 中的“weak”(弱),描述的是 JavaScript 垃圾回收程序对待“弱映射”中键的方式。 基本API 1....创建 可以使用 new 关键字实例化一个空的 WeakMap: const wm = new WeakMap(); 注意:弱映射中的键只能是 Object 或者继承自 Object 的类型,尝试使用非对象设置键会抛出...: const str = new String("小明"); const wm = new WeakMap([ [str, 10] ]); 2. set() set(): 给WeakMap实例添加键...WeakMap 确实没有这个方法。因为不可能迭代,所以也不可能在不知道对象引用的情况下从弱映射中取得值。即便代码可以访问 WeakMap 实例,也没办法看到其中的内容。
for (const [key, value] of map2) { console.log(key, value) } WeakMap WeakMap的使用 和Map类型的另外一个数据结构称之为WeakMap...和Map的区别二: const map = new Map() map.set(obj, "aaa") const weakMap = new WeakMap() weakMap.set(obj, "...代码演示 可以做对象的依赖收集 先把对象的属性和属性对应的依赖,存储为Map结构,一个key 对应一组收集的函数依赖 然后把对象 和Map 结构存储为weakMap 当代理的对象有变化时,我们去weakMap...const weakMap = new WeakMap() // 2.收集依赖结构 // 2.1.对obj1收集的数据结构 const obj1Map = new Map() obj1Map.set...("name", [obj1NameFn1, obj1NameFn2]) obj1Map.set("age", [obj1AgeFn1, obj1AgeFn2]) weakMap.set(obj1, obj1Map
在 JavaScript 里,map API 可以通过使其四个 API 方法共用两个数组(一个存放键,一个存放值)来实现。给这种 map 设置值时会同时将键和值添加到这两个数组的末尾。...当从该 map 取值的时候,需要遍历所有的键,然后使用索引从存储值的数组中检索出相应的值。...因此,如果你想要这种类型对象的 key 值的列表,你应该使用 Map。 基本上,如果你要往对象上添加数据,又不想干扰垃圾回收机制,就可以使用 WeakMap。...属性 WeakMap.length length 属性的值为 0。 ? WeakMap.protorype WeakMap 构造器的原型。允许添加属性到所有的 WeakMap 对象。 ?...使用 WeakMap const wm1 = new WeakMap(), wm2 = new WeakMap(), wm3 = new WeakMap(); const o1
weakMap 什么是WeakMap 在 JavaScript 里,map API 可以通过使其四个 API 方法共用两个数组(一个存放键,一个存放值)来实现。...原生 WeakMap 的结构是特殊且有效的,其用于映射的 key 只有在其没有被回收时才是有效的。 正由于这样的弱引用,WeakMap 的 key 是不可枚举的 (没有方法能给出所有的 key)。...因此,如果你想要这种类型对象的 key 值的列表,你应该使用 [Map] 基本上,如果你要往对象上添加数据,又不想干扰垃圾回收机制,就可以使用 WeakMap。...WeakMap的建只能是对象类型 如果变成object类型当作键存储就可以执行 const myWaekMap = new WeakMap(); const arr =... {ƒ => "存储a=1"} 另外 WeakMap的值也可以是一个对象,但这样没有太大意义 const myWaekMap = new WeakMap(); const arr
这也是一篇关于WeakMap的笔记。 ---- 简介 WeakMap与Map(另一个ES6的新API)都是键值对象,有着类似的API:set、get、has和delete。...之所以打引号是因为并不是不能用对象,而是对象会转换成字符串,如下: var map = {}; var key = {}; map[key] = 'value'; map['[object Object...]'] === 'value'; // true 于是ES6就提供了Map与WeakMap的API,可以实现键是对象的情况。...于是又提供了WeakMap,它的键只能是一个非空(null)对象,而Map的键则还可以是除对象外的原始类型。WeakMap的重要特点在于:对键的引用是弱引用,而不是一般的强引用。...看如下例子: var map = new WeakMap(), element = document.querySelector(".element"); // 对象element作为键,"Original
学习时间:2020.05.26 学习章节:《你不知道的 WeakMap》 一、主要知识点 原文主要复习了“JavaScript垃圾回收机制”,“Map/WeakMap区别”和“WeakMap 属性和方法...Map VS WeakMap 2.1 Map 和 WeakMap 主要区别 WeakMap 结构与 Map 结构类似,也是用于生成键值对的集合。...区别: Map 对象的键可以是任何类型,但 WeakMap 对象中的键只能是对象引用( null 除外);const map = new WeakMap(); map.set(1, 2) // TypeError...Invalid value used as weak map key WeakMap 不能包含无引用的对象,否则会被自动清除出集合(垃圾回收机制);const map = new WeakMap();...'hello'); map.map(item => console.log(item)) //Uncaught TypeError: map.map is not a function WeakMap
between zero and the `clientHeight` of the element. let frames = ["0px", `${element.clientHeight}px`].map...也就是 Map 和 WeakMap 对象。例如: a thing....是可以解决问题的,但是为啥在这里使用 WeakMap 呢。...WeakMap 和 Map 的主要区别就是:WeakMap 的键名所引用的对象是弱引用。 弱引用:在计算机程序设计中,弱引用与强引用相对,是指不能确保其引用的对象不会被垃圾回收器回收的引用。...所以,现在这个场景我们使用 WeakMap 再合适不过了, WeakMap 使用的所有的 key 都会在合适的场景下被回收,我们就不用担心内存泄漏了~ 下面再来看看我们的代码: window.seCache
介绍 WeakMap与WeakSet都是一种优化使用内存的解决方案。这两个数据结构的引用不会导致这些对象不被回收。上来就说这些有点太枯燥了,还是先聊聊它们能干什么。...set.add(1) // TypeError: Invalid value used in weak set WeakMap 上文提到的WeakSet,我是不知道它到底被广泛应用到哪里了。...但是WeakMap有一个特别有用的地方:存储私有变量。 我们知道,JS中没有真正的私有,但是我在使用TS编译器就运用了WeakMap来储存所谓的私有变量。...由于WeakMap对对象的引用不会被GC当回事,所以当我们foo1或foo2使用完毕被回收后,它们在WeakMap里的引用也会被清除掉,这样就节约了内存。...顺带一提,同WeakSet一样,WeakMap的键必须是对象: barStorage.set(1, 2) // TypeError: Invalid value used as weak map key
相信很多读者对 ES6 引入的 Map 已经不陌生了,其中的一部分读者可能也听说过 WeakMap。既生 Map 何生 WeakMap?...二、为什么需要 WeakMap 2.1 Map 和 WeakMap 的区别 相信很多读者对 ES6 中 Map 已经不陌生了,已经有了 Map,为什么还会有 WeakMap,它们之间有什么区别呢?...Map 和 WeakMap 之间的主要区别: Map 对象的键可以是任何类型,但 WeakMap 对象中的键只能是对象引用; WeakMap 不能包含无引用的对象,否则会被自动清除出集合(垃圾回收机制)...所以对于前面遇到的垃圾回收问题,我们可以使用 WeakMap 来解决,具体如下: let sem = { name: "Semlinker" }; let map = new WeakMap(); map.set...下面我们来动手测试一下同个场景下 Map 与 WeakMap 对垃圾回收的影响。首先我们分别创建两个文件:map.js 和 weakmap.js。
WeakMap 就是来解决这个问题的: 对比 2 组代码,分别是 map 和 weakMap 在这个问题下的表现: Map let john = { name: "John" }; let map =...new Map(); map.set(john, "..."); john = null; // 覆盖引用 console.log(map.keys()) // 仍然能访问 // john 被存储在了...map 中, // 我们仍可以使用 map.keys() 来获取它 WeakMap ``` let john = { name: "John" }; let weakMap = new WeakMap...``` WeakMap 中使用一个对象作为键,并且没有其他对这个对象的引用 —— 该对象将会被从内存(和map)中自动清除。...此外特别说明:WeakMap 和 Map 的很重要的不同点就是,WeakMap 的键必须是对象,不能是原始值。
领取专属 10元无门槛券
手把手带您无忧上云