V8如何处理这个/ dict?

时间:2013-12-18 04:21:39

标签: javascript v8

从V8演示文稿中,我知道它通过标记类型对象来优化这样的结构:

function Point(x, y) {
  this.x = x;
  this.y = y;
}

在不使用this的情况下返回对象(JSON)的情况会怎样? V8会应用相同的优化吗?

function parse() {
  ...
  // Suppose error happened (some branch of logic):
  return {
    pos: i,
    message: 'ka-boom'
  };
  ...
  // Everything is OK:
  return {
    value: 42
  };
}

在上面的示例中,V8会标记类型对象(因此,成员访问是否有机会快速实现)或保留为地图?请注意,不同的路径会返回不同的对象。

1 个答案:

答案 0 :(得分:1)

对象文字对文字内部引入的属性(不在外部)进行相同的优化。

现在构造的对象另外可以获得8个属性,可以在外面引入而不会受到惩罚。这意味着子类可以调用父构造函数,而无需担心最多8个属性。但是,当然可选引入属性仍然很糟糕。

但是,如果您的对象文字需要函数或其他不可变的重量级数据,那么不使用原型会让您付出沉重的代价。

同样在这些情况下,对象不一定会成为哈希表,但属性只会放在外部数组中。这比Java / C ++更慢 - 就像它们处于最快模式但不像最慢的哈希表模式那样慢的对象。

因此有3种存储模式:快速对象(如C ++ / Java对象),快速对象(无示例),慢哈希表(如PHP,Python,Ruby在其规范实现中)