首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >JavaScript VM如何实现对象属性访问?是Hashtable吗?

JavaScript VM如何实现对象属性访问?是Hashtable吗?
EN

Stack Overflow用户
提问于 2011-07-06 01:41:05
回答 3查看 10K关注 0票数 34

JavaScript中的对象可以用作哈希表(关键字必须是字符串),它与哈希表的数据结构一样好吗?

我的意思是,它是在幕后作为Hashtable实现的吗?

更新:(1)我把HashMap改成了哈希表(2)我猜大多数浏览器实现它都是一样的,如果不是,为什么不呢?在ECMAScript规范中对如何实现它有什么要求吗?

FirefoxUpdate2setter:我理解,我只是想知道V8和 JS是如何实现Object.properties的getter/setter的?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-07-07 03:51:50

V8没有将对象属性访问实现为哈希表,它实际上以一种更好的方式实现了它(在性能方面)

那么它是如何工作的呢?"V8不使用动态查找来访问属性。取而代之的是,V8在幕后动态创建隐藏类“-这使得对属性的访问几乎与访问C++对象的属性一样快。

为什么?因为在固定类中,每个属性都可以在特定的固定偏移量位置找到。

因此,一般来说,在V8中访问对象的属性比在哈希表中更快。

我不确定它在其他虚拟机上是如何工作的

更多信息可在此处找到:https://developers.google.com/v8/design#prop_access

你也可以在这里阅读更多关于JS中的哈希表:(我的博客) http://simplenotions.wordpress.com/2011/07/05/javascript-hashtable/

票数 41
EN

Stack Overflow用户

发布于 2020-05-28 19:56:05

大多数现代JS引擎使用非常类似的技术来加速对象属性访问。该技术基于所谓的隐藏类或形状。理解这种优化是如何工作的,对于编写高效的JS代码非常重要。

JS对象看起来像一个字典,那么为什么不使用一个来存储属性呢?哈希表的访问复杂度为O(1),看起来是一个很好的解决方案。实际上,第一个JS引擎就是这样实现对象的。但在静态类型化语言中,如C++或Java,类实例属性访问速度非常快。在这样的语言中,类实例只是一段内存,end每个属性都有它自己的常量偏移量,所以要获得属性值,我们只需要获取实例指针并将偏移量加到它上面。换句话说,在编译时,像这样的point.x表达式只是替换为它在内存中的地址。

也许我们可以在JS中实现一些类似的技术?但是怎么做呢?让我们看一个简单的JS函数:

代码语言:javascript
复制
function getX(point) {
  return point.x;
}

如何获取point.x的值?这里的第一个问题是我们没有一个类(或形状)来描述point。但我们可以计算一个,这就是现代JS引擎所做的。大多数JS对象在运行时都有一个绑定到对象的形状。形状描述了对象的属性以及这些属性值的存储位置。它非常类似于类定义在C++或Java中描述类的方式。这是一个相当大的问题,一个物体的形状是如何计算的,我不会在这里描述它。我推荐this articlethis post,前者对形状有很好的解释,后者解释了如何在V8中实现这些东西。关于形状,你应该知道的最重要的事情是,所有具有相同属性的对象以相同的顺序添加将具有相同的形状。有几个例外,例如,如果一个对象有很多频繁更改的属性,或者如果您使用delete操作符删除了一些对象属性,则该对象将切换到字典模式,并且不会有形状。

现在,让我们假设point对象有一个属性值数组,并且附加了一个形状,该形状描述了该属性数组中x值的存储位置。但还有另一个问题-我们可以将任何对象传递给函数,甚至不需要对象具有x属性。这个问题是通过称为Inline caching的技术来解决的。这非常简单,当第一次执行getX()时,它会记住点的形状和x查找的结果。当第二次调用该函数时,它会将该点的形状与前一个点的形状进行比较。如果形状匹配,则不需要查找,我们可以采用先前的查找结果。

主要的结论是,所有描述同一事物的对象都应该具有相同的形状,即它们应该具有以相同顺序添加的相同属性集。它还解释了为什么总是初始化对象属性更好,即使它们在缺省情况下是undefined的,here is很好地解释了这个问题。

相对资源:

票数 6
EN

Stack Overflow用户

发布于 2019-05-09 04:14:20

本文解释了如何在Node.js和大多数版本的Google Chrome使用的引擎V8中实现它们

https://v8.dev/blog/fast-properties

显然,“策略”可能会随着时间的推移而改变,这取决于属性的数量,从命名值数组到字典。

v8还考虑了类型,数字或字符串将不会以与对象(或函数,一种对象类型)相同的方式处理

如果我理解正确的话,频繁的属性访问,例如在循环中,将被缓存。

v8通过观察代码的实际功能和频率来动态优化代码

v8将标识具有相同命名属性集的对象,并以相同的顺序添加这些属性(就像类构造函数所做的那样),或者使用一些重复的JSON,并以相同的方式处理它们。

有关更多详细信息,请参阅文章,然后在google申请工作:)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6586670

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档