gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 02:35:51 28 4
gpt4 key购买 nike

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

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

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/

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