JavaScript 进阶实战课
石川
JavaScript Patterns and Anti-Patterns 等开源项目创建者,O'Reilly 技术评审
15066 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 47 讲
开篇词 (1讲)
JavaScript 进阶实战课
15
15
1.0x
00:00/00:00
登录|注册

15 | 如何通过哈希查找JS对象内存地址?

你好,我是石川。
我们曾经讲过,在 Javascript 中,对象在调用栈中只做引用不做存储,实际的存储是在堆里面实现的。那么我们如何查找对象在堆里的实际存储地址呢?通过我们对字典的了解,这个问题就迎刃而解了。字典也被称作映射、符号表或关联数组,这么说可能比较抽象,所以我们先来说说字典的一种实现:散列表。

散列表:如何检查单词是否存在

如果你用过一些文档编辑的软件,应该很常用的一个功能就是拼写检查,这个检查是怎么做到的呢?从它的最底层逻辑来说,就是看一个单词存在与否。那么一个单词是否存在是如何判断的呢?这里就需要用到散列表。散列表的实现逻辑就是基于每个单词都生成一个唯一的哈希值,把这些值存放在一个数组中。当我们想查询一个词是否有效,就看这个词的哈希值在数组中是否存在即可。
假设我们有上图中这样的一组城市的键值对组成的对象,我们可以看出,在哈希的过程中,一个城市的键名,通过一个哈希函数,生成一个对应的唯一的哈希值,这个值被放到数组中,形成一个哈希列表。下次,当我们想要访问其中数据的时候,就会通过对这个列表的遍历来查询相关的值。
这里我们可以看到,图中间位置的是哈希函数,我们需要一个哈希函数来生成哈希值,那么哈希值是怎么生成的呢?生成散列表中的哈希值有很多种方式,比如素数哈希、ASCII 哈希,还有 djb2 等方式。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入探讨了哈希查找和字典数据结构的原理和实现,以及在JavaScript中的应用。从散列表的原理和实现逻辑出发,介绍了哈希函数生成唯一的哈希值,并存放在数组中以实现快速查询。此外,还详细讲解了不同的哈希算法,如素数哈希、ASCII哈希和djb2算法,以及它们的实现方式和原理。文章还介绍了字典的作用和数据结构,以及在JavaScript中对象引用的存储和查找方式。另外,还介绍了ES6中引入的Map和Set数据结构,以及WeakMap和WeakSet的特点和用途。此外,还通过Java中的HashMap、LinkedHashMap和TreeMap等数据结构,深入探讨了哈希碰撞的解决方式。总的来说,本文内容丰富,涵盖了哈希查找和字典数据结构的原理、实现和应用,对读者深入理解相关概念具有重要参考价值。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《JavaScript 进阶实战课》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(3)

  • 最新
  • 精选
  • CondorHero
    能加餐讲讲 Map 和 Set 存储和操作数据为什么比 对象和数组高效吗。

    作者回复: 我们拿object vs. map 为例,几个肉眼可见的原因是:1. 对象只允许键是字符串或符号,如果是其它类型,就会被转化成字符串。2. 继承不必要的属性,var hashMap = {} 会继承很多map不需要的属性 3. 缺少一些需要的属性比如获取大小等。除此之外通过性能测试也可以看到性能差异。

    2022-11-04归属地:北京
    2
  • hsiang271828
    若创建了一个js对象,如何找到它对应的内存地址呢?

    作者回复: 举个例子,按照文中讲的,你可以1. 在开发者工具的console tab输入下面代码,2. 然后到 memory tab 点击 take snapshot 3. 搜索NumItem就可以找到相关对象@符号后面的地址。 function NumItem(x) { this.x = x; } function generateNum() { var result = new Array(20); for (var i = 0, l = result.length; i < l; i++) { result[i] = new NumItem(i); } return new NumItem(result); } generateNum();

    2022-10-26归属地:北京
    1
  • 安安安
    对象的映射关系是通过字典来存储的,这句话我认为并不是很准确。 通过V8文章https://v8.dev/blog/fast-properties 中的说法,对象属性分为快属性和慢属性。在快属性情况下是通过隐藏类(Hidden Class)上的描述符数组(descriptor array)来找到属性在内存中的地址。慢属性才使用了字典。
    2023-02-22归属地:北京
    2
收起评论
显示
设置
留言
3
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部