gpt4 book ai didi

javascript - 在 v8 中声明具有未知值的(类)属性的最佳(性能最高)方法

转载 作者:行者123 更新时间:2023-11-27 22:46:08 25 4
gpt4 key购买 nike

所以我了解了一些关于 v8 中隐藏类概念的知识。据说您应该在构造函数中声明所有属性(如果使用基于原型(prototype)的“伪类”),并且您不应该 delete它们或在构造函数之外添加新的。到目前为止,一切顺利。

1) 但是,如果您知道类型(您也不应该更改)但不知道(初始),那么属性又如何呢?

例如,做这样的事情是否足够:

var Foo = function () {
this.myString;
this.myNumber;
}

...稍后分配具体值,或者最好预先分配一个“虚假”值,如下所示:

var Foo = function () {
this.myString = "";
this.myNumber = 0;
}

2)另一件事是对象。有时我只是知道一个对象不会有固定的结构,但我想将它用作 HashMap 。是否有任何(非详细)方法告诉编译器我想以这种方式使用它,这样它就不会被优化(并在稍后被取消)?

更新

感谢您的投入!因此,在阅读了您的评论(以及互联网上的更多评论)后,我认为这些要点是“最佳实践”:

  • 在构造函数中定义类的所有属性(也适用于定义简单对象)
  • 您必须为这些属性分配某些内容,即使只是 nullundefined - 只是说明this.myString;显然还不够
  • 因为无论如何你都必须分配一些东西,我认为分配一个“假”值以防你不能立即分配最终值不会造成伤害,这样编译器就会尽快“知道”你想使用什么类型。因此,例如 this.myString = "";
  • 对于对象,如果您事先知道,请分配整个结构;如果您不立即知道,请再次为其属性分配虚拟值。否则,例如当打算使用对象作为 HashMap 时,只需执行:this.myObject = {}; 。认为不值得向编译器表明这应该是一个 HashMap 。如果您真的想要这样做,我发现了一个技巧,可以为该对象分配一个虚拟属性和 delete之后立即进行。但我不会这样做。
  • 对于较小的数组,显然建议(引用: https://www.youtube.com/watch?v=UJPdhx5zTaw&feature=youtu.be&t=25m40s )预先分配它们,特别是如果您知道最终大小,例如: this.myArray = new Array(4);
  • 不要delete稍后属性!就null如果需要的话,他们
  • 分配后不要更改类型!这将添加另一个隐藏类并损害性能。无论如何,我认为这是最佳实践。无论如何,我具有不同类型的唯一情况是对于某些函数参数。在这种情况下,我通常将它们转换为相同的目标类型。
  • 如果您以后继续添加其他属性,同样适用。

话虽这么说,我也认为这样做将倾向于更干净、更有组织的代码,并且也有助于记录。

是的,所以还有一点我不确定:如果我在构造函数中调用的函数(例如一种 configure() 方法)中定义属性会怎样?

最佳答案

Re 1):仅读取属性(如第一个代码片段中所示)不会对对象执行任何操作。您需要分配它们来创建属性。

但是对于对象属性来说,用什么值来初始化它们实际上并不重要,只要你确实初始化了它们。即使未定义也应该没问题。

具体值与数组更为相关,您需要确保使用正确的元素(并且没有任何漏洞!)创建它们,因为虚拟机试图保持它们同构。特别是,永远不要使用 Array 构造函数,因为这只会产生漏洞。

Re 2):有很多方法可以欺骗虚拟机使用字典表示,但它们取决于虚拟机和版本,并且并不真正可靠。一般来说,最好避免完全使用对象作为 map 。从 ES6 开始,就有了一个合适的 Map 类。

关于javascript - 在 v8 中声明具有未知值的(类)属性的最佳(性能最高)方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38405560/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com