Giter VIP home page Giter VIP logo

Comments (2)

yaofly2012 avatar yaofly2012 commented on May 29, 2024

Map

一、语法

1.1 功能

Mapkey-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和对象

  1. 对象是key-value集合,但是无序的,并且key只能是字符串或者Symbol,所以对象可以是视为属性集合;
    当然了也没那么无序,见getOwnPropertyNames
  2. 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 准备

  1. 哈希表数据结构回顾;
  2. Map采用的是确定性哈希表算法

3.2 Map如何实现的

问题

和一般的Hash表算法不同的是ES2015的Map有几个问题待解决:

  1. key可以是任意类型,即hash函数可以把任意类型的key转成整数;
  2. 保证有序。

下面的研究参考深入理解V8 Map的实现

hash函数

不同类型的key采用不同的hash函数:

  1. 数字类型:基本本身值一通位运算
  2. 字符串和Symbol类型:基于字符串内容计算
  3. 其他:随机数,并保存内部header里 ?

corejs怎么实现Map

V8采用C++实现Map的目前实在看不懂源码(),只能看corejs的实现了。

有序保证

采用确定性哈希表算法

参考

  1. [V8 Deep Dives] Understanding Map Internals
  2. Optimizing hash tables: hiding the hash code

from note.

yaofly2012 avatar yaofly2012 commented on May 29, 2024

WeakMap

一、语法

1.1 功能

Map区别在于:

  1. key是弱引用(weakly referenced );
  2. 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)
  1. 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了:

  1. get
  2. set
  3. has
  4. delete

1.4 为什么需要WeakMap

如果你要往对象上(key引用的对象)添加额外的数据,不想修改原对象(或则原对象根本就不可扩展),又不想干扰垃圾回收机制,就可以使用WeakMap

比如:

  1. DeepCopy里利用WeakMap解决循环引用时记录已经Copy的对象。

参考

  1. What are the actual uses of ES6 WeakMap?

from note.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo 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.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.