在 v8 中声明具有未知值的 (class) 属性的最佳(最高性能)方式

Best (most performant) way to declare (class) properties with unknown values in v8

所以我了解了一些关于 v8 中隐藏的 class 概念。据说你应该在构造函数中声明所有属性(如果使用基于原型 "pseudo classes")并且你不应该 delete 它们或在构造函数之外添加新属性。到目前为止,还不错。

1) 但是如果您知道 type(您也不应更改)但不知道(初始)value[=59 的属性呢? =]?

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

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

... 并在稍后分配具体值,或者预先分配一个 "bogus" 值会更好,如下所示:

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

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

更新

感谢您的意见!因此,在阅读了您的评论(以及互联网上的更多评论)后,我将这些观点视为 "best practices":

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

话虽这么说,我也认为这样做会使代码更清晰、更有条理,并且还有助于记录。

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

Re 1): 就像在您的第一个片段中一样,只读取属性不会对对象做任何事情。您需要分配它们才能创建属性。

但是对于 object 属性来说,用什么值初始化它们实际上并不重要,只要你初始化它们。即使 undefined 应该没问题。

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

Re 2): 有一些方法可以诱使 VM 使用字典表示,但它们取决于 VM 和版本,并且不是很可靠。通常,最好避免将对象完全用作地图。从 ES6 开始,有一个合适的 Map class.