浅析v8中weakSet和weakMap(待续)

121 篇文章 1 订阅

这里写图片描述

图中为整个代码的执行过程。从js层初始化一个集合到底层的实现,其他的增删改查也类似的流程。底层是一个由UHashElement结构体组成的数组,UHashElement结构体包括每个元素的键值和哈希值。UHashtable中还含有一些扩大和缩小哈希表的操作。

set和map基本类似,下面通过代码大概了解一下。

function WeakMapConstructor(iterable) {
  // 必须加new
  if (IS_UNDEFINED(new.target)) {
    throw MakeTypeError(kConstructorNotFunction, "WeakMap");
  }
  // 初始化底层哈希表
  %WeakCollectionInitialize(this);
  // 如果没有传参则创建一个空的哈希表
  if (!IS_NULL_OR_UNDEFINED(iterable)) {
    // set函数在下面代码中挂载
    var adder = this.set;
    // 判断set是不是函数
    if (!IS_CALLABLE(adder)) {
      throw MakeTypeError(kPropertyNotFunction, adder, 'set', this);
    }
    // 迭代参数,逐个加到哈希表中
    for (var nextItem of iterable) {
      if (!IS_RECEIVER(nextItem)) {
        throw MakeTypeError(kIteratorValueNotAnObject, nextItem);
      }
      // 把内容加到哈希表
      %_Call(adder, this, nextItem[0], nextItem[1]);
    }
  }
}


function WeakMapGet(key) {
  if (!IS_WEAKMAP(this)) {
    throw MakeTypeError(kIncompatibleMethodReceiver,
                        'WeakMap.prototype.get', this);
  }
  if (!IS_RECEIVER(key)) return UNDEFINED;
  // 根据键拿到一个hashcode,然后到哈希表里进行操作
  var hash = GetExistingHash(key);
  if (IS_UNDEFINED(hash)) return UNDEFINED;
  return %WeakCollectionGet(this, key, hash);
}

我们可以看到js层的代码很简单,我们new Map的时候创建一个哈希表,增删改查的时候,首先根据key拿到一个hashcode,然后到底层哈希表里进行操作。

时间有限,后面有时间继续研究,,,

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值