从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会标记类型对象(因此,成员访问是否有机会快速实现)或保留为地图?请注意,不同的路径会返回不同的对象。
答案 0 :(得分:1)
对象文字对文字内部引入的属性(不在外部)进行相同的优化。
现在构造的对象另外可以获得8个属性,可以在外面引入而不会受到惩罚。这意味着子类可以调用父构造函数,而无需担心最多8个属性。但是,当然可选引入属性仍然很糟糕。
但是,如果您的对象文字需要函数或其他不可变的重量级数据,那么不使用原型会让您付出沉重的代价。
同样在这些情况下,对象不一定会成为哈希表,但属性只会放在外部数组中。这比Java / C ++更慢 - 就像它们处于最快模式但不像最慢的哈希表模式那样慢的对象。
因此有3种存储模式:快速对象(如C ++ / Java对象),快速对象(无示例),慢哈希表(如PHP,Python,Ruby在其规范实现中)