javascript - o[str] 与 (o => o.str)

标签 javascript optimization v8

我正在编写一个函数,该函数需要一个对象和一个投影来了解它必须在哪个字段上工作。

我想知道是否应该使用这样的字符串:

const o = {
  a: 'Hello There'    
};


function foo(o, str) {
  const a = o[str];
  /* ... */    
}

foo(o, 'a');

或者使用函数:

function bar(o, proj) {
  const a = proj(o);
  /* ... */
}

bar(o, o => o.a);

我认为 V8 正在使用我的 javascript 对象创建类。如果我使用字符串动态访问字段,它仍然能够使用我的对象而不是哈希表或其他内容创建一个类吗?

最佳答案

V8 开发人员在这里。 “我应该使用哪种模式?”的答案可能是“看情况”。我可以想到其中一个或另一个(可能)会(一点)更快的场景,具体取决于您的应用程序的行为。因此,我建议您要么尝试两者(在真实代码中,而不是微基准测试!)并自行测量,或者简单地选择您喜欢的和/或在更大的上下文中更有意义的一个,并且不要担心它,直到分析表明这是一个真正的瓶颈,值得花时间解决。

如果这些属性确实在调用站点已知,那么最快的选择可能是在调用之前加载该属性:

function baz(o, str, a) {
  /* ... */
}

baz(o, "a", o.a);

我意识到,如果事情真的这么简单,你可能不会问这个问题;如果这个假设成立,那么这是一个很好的例子,说明微基准的简化如何轻松改变正确的答案。

<小时/>

类问题的答案是,这个决定对 V8 在底层如何表示对象没有影响——这主要取决于您如何修改对象,而不是如何读取它们。另外,郑重声明:

  • 每个对象都有一个“隐藏类”;是否使用哈希表表示与其正交
  • 对于任何给定的对象,哈希表模式或形状跟踪模式是否更好是取决于用例的事情之一,这正是两种模式存在的原因。我不会太担心这个问题,除非您(从分析中)知道这恰好是您案例中的一个问题(通常,V8 的启发式方法是正确的;很少需要手动干预)。

关于javascript - o[str] 与 (o => o.str),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47924267/

相关文章:

javascript - 将 bootstrap-vue modal 附加到应用程序模板

c++ - 我如何重载 new/STL 以使未知对象更快?

javascript - Express - 更新对数据库MongoDB不生效

javascript - 调整 CKEditor 的大小

python - 如何强制scipy优化模块的功能同时采用函数及其梯度

c# - 如何优化这段代码?

javascript - 如何使用 v8 隐藏类优化技术进行优化?

javascript - Node.js中的内存泄漏-如何分析分配树/根?

JavaScript 优化 : how to cache local variables' initial values more efficiently?

javascript - 谷歌地图在页面宽度上更改偏移中心