我很好奇将相同元素分配给自己的表现。 V8是否足够聪明,了解这不应该被执行?
obj.key = obj.key;
用例就像是。
Object.keys(otherObj).forEach(e => {
if(!obj[e]) {
obj[e] = foo();
}
});
如果我们使用三元运算符而不是if语句,是否会有惩罚性能?
Object.keys(otherObj).forEach(e => obj[e] = obj[e] ? obj[e] : foo());
答案 0 :(得分:1)
V8开发者在这里。我不认为obj[e] = obj[e]
分配将被优化掉的情况。确定这样的优化是有效的,需要了解obj
和e
的大量知识,以便在大多数情况下检查所有这些都太贵而不值得。
正如Bergi指出的那样,obj[e] = (... ? obj[e] : ...)
在概念上要复杂得多,因此即使你假设我们将花费更多时间来改进V8,也更不可能被优化掉。
关于obj.key
vs obj[e]
(对于加载和存储),如果它们只看到一个对象形状而只看到一个属性名称,那么它们的性能几乎相同。如果[e]
看到多个属性名称(例如循环遍历Object.keys()
的示例),则会稍慢一些;然而,.key
并不是真正的替代选择 - [e]
的灵活性使其变得更慢。如果他们中的任何一个看到obj
的多个形状,那么它们会慢于其他形状,[e]
比.key
受到更大的打击;这将是例如当您的循环最终添加之前没有的属性时就是这种情况。
所有这一切,任何性能差异可能都太小而无关紧要,我的建议是编写最具可读性的代码 - 或运行自己的测量结果以确定是否存在' sa在你的情况下可衡量的差异。请记住,微基准测试通常会产生误导;使用尽可能接近生产环境的应用程序进行此类测试。