Comments (2)
Map
一、语法
1.1 功能
Map
是key-value
的有序集合,其中key
可以是任意数据类型。
1.2 同值相等
虽然规范里Map判断两个key是否相等采用同值相等算法,但是ES规范里0
和-0
是相等的,即本质采用的是0值相等
算法。
var s = new Map();
s.set(NaN, 1)
s.set(-0, 2);
s.has(NaN); // true
s.has(+0,); // true
1.3 Map和对象
- 对象是
key-value
集合,但是无序的,并且key
只能是字符串或者Symbol
,所以对象可以是视为属性集合;
当然了也没那么无序,见getOwnPropertyNames
- Map是有序的
key-value
集合,并且key
可以是任意类型的数据。
MDN还详细总结了两者的区别,见Objects 和 maps 的比较。
两者通过key查找value的时间复杂度都是O(1)。
对象转Map对象
利用Object.entries
函数
var obj = {
name: 'join',
age: 22
}
var map = new Map(Object.entries(obj))
Map对象转对象
var map = new Map()
map.set('name', 'join');
map.set('age', 22)
map.set(() => {}, 'func')
var a = Object.fromEntries(map.entries())
obj.keys(a) // ["name", "age", "() => {}"]
因为Map的key可以是任意类型,在转对象过程中Object.fromEntries
函数会被引用类型的key转成字符串。
对象转key-value对的方法entries
是挂载到Object
上的静态方法,即Object.entries
,并且返回的是个数组。而Map确是个成员方法Map.prototype.entries
,并且返回的是个迭代器。
这样设计的动机是什么?
二、Map
等于两个数组!!!???
用两个数组模拟Map
:一个数组用于存储key,另一个数组用于存储value。两个数组各元素一一对应。
但是这样无法实现通过key查找value的时间复杂度都是O(n)。性能肯定比Map
差远了。
三、Map
怎么实现的 TODO
3.1 准备
3.2 Map
如何实现的
问题
和一般的Hash表算法不同的是ES2015的Map有几个问题待解决:
- key可以是任意类型,即hash函数可以把任意类型的key转成整数;
- 保证有序。
下面的研究参考深入理解V8 Map的实现
hash函数
不同类型的key采用不同的hash函数:
- 数字类型:基本本身值一通位运算
- 字符串和
Symbol
类型:基于字符串内容计算 - 其他:随机数,并保存内部header里 ?
corejs怎么实现Map
的
V8采用C++实现Map
的目前实在看不懂源码(囧),只能看corejs的实现了。
有序保证
采用确定性哈希表算法
参考
from note.
WeakMap
一、语法
1.1 功能
跟Map
区别在于:
- key是弱引用(weakly referenced );
- key只能是非
null
的对象;
var map = new WeakMap();
// TypeError: Invalid value used as weak map key
map.set(1, 12)
// TypeError: Invalid value used as weak map key
map.set(null, 12)
WeakMap
对象不是可迭代对象。
typeof WeakMap.prototype[Symbol.iterator] //"undefined"
1.2 什么是弱引用(weakly referenced )?
native WeakMaps hold "weak" references to key objects, which means that they do not prevent garbage collection in case there would be no other reference to the key object. This also avoids preventing garbage collection of values in the map.
不影响JS引擎对key的GC。
1.3 WeakMap
对象不是可迭代对象
WeakMap
对象的key可能随时被GC了。获取key列表是无意义的,所以 WeakMap
对象不是可迭代对象。
var map = new WeakMap();
// TypeError: map is not iterable
for(var i of map) {
console.log(i)
}
也是因为这个原因WeakpMap
没有遍历相关的方法(forEach
, entiries
, keys
, values
)并且还没有size
属性(size
属性也是无意义的)。
最后相对于Map
只剩下4个API了:
- get
- set
- has
- delete
1.4 为什么需要WeakMap
如果你要往对象上(key引用的对象)添加额外的数据,不想修改原对象(或则原对象根本就不可扩展),又不想干扰垃圾回收机制,就可以使用WeakMap
。
比如:
- DeepCopy里利用
WeakMap
解决循环引用时记录已经Copy的对象。
参考
from note.
Related Issues (20)
- Monorepos: Lerna VS npm/yarn/pnpm workspace HOT 1
- UIImage vs. CIImage vs. CGImage
- NSArray, NSMutableArray HOT 1
- nil, Nil, NULL, NSNull
- IOS 开发 HOT 5
- UIViewController HOT 3
- Formik 引发的Out of Memory异常
- 浏览器禁用JS之后
- App Clips & Google Play Instant HOT 2
- RN布局 & 适配 HOT 2
- PWA HOT 1
- App内置浏览器
- 实现RN轮播(走马灯/Swiper/Carousel/Snap/Tab )组件 HOT 1
- Deferred Deep Link
- Lottie
- RN-SafeAreaView
- RN-Image & ImageBackground HOT 2
- 修改`python3`版本 HOT 2
- 页面跳转或者提交Form过程中SVG动画不执行了!!! HOT 1
- Apple Pay In-App Provisioning HOT 2
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from note.