这与 V8 是否能够根据 `const` 的值消除死代码? 除了不是导出的
const
之外,我有以下 JavaScript 代码:
// ... a `state` object is available as well as `newKey` and `newVal` strings and `isEqual` boolean
const newObj = { ...state.obj, [newKey]: newVal };
return isEqual ? state : { ...state, obj: newObj };
预热的 V8 是否可以注意到,仅当
newObj
为 false 时才使用 isEqual
,并避免分配 newObj
?
我知道,如果我绝对想避免不必要的
分配,我应该将其移至条件 (newObj
) 或根据
isEqual ? state : {...state, obj: {...}}
(isEqual
) 有条件地分配它。我想更好地了解 V8 是否能够基于 runtime const 消除这种死代码,以更好地实现可读性与性能的权衡。
const newObj = isEqual ? undefined : {...}
(我了解分析、过早优化等,我们假设我有充分的理由避免在这部分代码中进行不必要的分配。)
(这里是 V8 开发者。)
在快速测试中,
newObj
的分配不会被推入条件分支。对象是无条件分配的,只有在之后才会考虑 isEqual ?
决策。
也就是说,我个人认为在这种特殊情况下可读性和性能之间没有任何权衡。恕我直言,
if (isEqual) return state;
return { ...state, obj: { ...state.obj, [newKey]: newVal } };
(如果您愿意,可以选择使用
else
)将更具可读性和更高的性能。
FWIW,整个问题与“死代码消除”无关。这里没有可以消除的死代码。您询问的是如何将操作移至条件分支。我不知道“运行时常量”是什么意思。