o[str] vs (o => o.str)
o[str] vs (o => o.str)
我正在编写一个函数,它接受一个对象和一个投影来了解它必须在哪个字段上工作。
我想知道我是否应该使用这样的字符串:
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 对象创建 classes。如果我使用一个字符串来动态访问一个字段,它是否仍然能够用我的对象创建一个 class 而不是哈希表或其他东西?
这里是 V8 开发人员。 "which pattern should I use?"的答案很可能是"it depends"。我可以想到其中一个或另一个(可能)(有点)更快的场景,具体取决于您的应用程序的行为。所以我建议您要么尝试两者(在实际代码中,而不是微基准测试!)并衡量自己,要么简单地选择您喜欢的 and/or 在更大的上下文中更有意义,并且在分析显示之前不要担心它这是一个值得花时间解决的实际瓶颈。
如果调用站点确实知道这些属性,那么最快的选择可能是在调用之前加载 属性:
function baz(o, str, a) {
/* ... */
}
baz(o, "a", o.a);
我意识到,如果事情真的这么简单,你可能不会问这个问题;如果该假设成立,那么这是一个很好的例子,说明微基准测试中的简化如何轻松改变正确答案。
类 问题的答案是,此决定对 V8 在底层表示对象的方式没有影响——这主要取决于您如何修改对象,而不是您如何从中读取对象.另外,作为记录:
- 每个对象都有一个"hidden class";它是否使用散列 table 表示与
正交
- 散列 table 模式或形状跟踪模式对于任何给定对象是否更好是取决于用例的事情之一,这正是这两种模式存在的原因。我不会太担心它,除非你知道(通过分析)它恰好是你的问题(通常情况下,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 对象创建 classes。如果我使用一个字符串来动态访问一个字段,它是否仍然能够用我的对象创建一个 class 而不是哈希表或其他东西?
这里是 V8 开发人员。 "which pattern should I use?"的答案很可能是"it depends"。我可以想到其中一个或另一个(可能)(有点)更快的场景,具体取决于您的应用程序的行为。所以我建议您要么尝试两者(在实际代码中,而不是微基准测试!)并衡量自己,要么简单地选择您喜欢的 and/or 在更大的上下文中更有意义,并且在分析显示之前不要担心它这是一个值得花时间解决的实际瓶颈。
如果调用站点确实知道这些属性,那么最快的选择可能是在调用之前加载 属性:
function baz(o, str, a) {
/* ... */
}
baz(o, "a", o.a);
我意识到,如果事情真的这么简单,你可能不会问这个问题;如果该假设成立,那么这是一个很好的例子,说明微基准测试中的简化如何轻松改变正确答案。
类 问题的答案是,此决定对 V8 在底层表示对象的方式没有影响——这主要取决于您如何修改对象,而不是您如何从中读取对象.另外,作为记录:
- 每个对象都有一个"hidden class";它是否使用散列 table 表示与 正交
- 散列 table 模式或形状跟踪模式对于任何给定对象是否更好是取决于用例的事情之一,这正是这两种模式存在的原因。我不会太担心它,除非你知道(通过分析)它恰好是你的问题(通常情况下,V8 的启发式方法是正确的;很少需要手动干预)。