这个问题不是问题,而是基于代码结构的V8优化的探索.
另一位开发人员和我正在讨论在V8的编译优化中const字符串文字与内联字符串文字的值.当然,假设我们总是处于严格模式.
以下是一些放在上下文中的代码示例:
const NAME = "something"; function doSomething(s) { return NAME + s; }
VS
function doSomething(s) { return "something" + s; }
我们的共识是:
- const为魔术值提供了更多的上下文,从而简化了维护.
我们不同意的是:
我说使用const允许V8对代码进行编译时优化,因为可以保证常量值不会改变.
他说,对于V8编译器,内联字符串的内容是相同的(如果不是更好,因为间接减少).因为在引用这样的内联字符串时可以同样应用相同的优化.
给我一点思考我倾向于同意他......每次调用函数时都会重新实例化字符串文字,但是V8可以很容易地对其进行优化,并避免后续调用.但是,我对编译器和编译器优化并不是那么了解.
任何人都可以对此有所了解吗?
V8开发人员在这里.
内联字符串在所有函数调用中共享,即使在未经优化的代码中也是如此,因此无需担心重新实例化.一般来说,JS引擎弄清楚文字永远不会改变(因为它们是文字,呃!)是微不足道的.A const
没有提供你想象的那么多保证,因为JavaScript很复杂(例如:
function makeFunction(val) { const NAME = val; function doSomething(s) { return NAME + s; } return doSomething; } var doSomething = makeFunction("something"); var doAnything = makeFunction("anything, really");
在这里,const NAME
你不是直觉上称之为常数;-)).
也就是说,两种方法之间的差异可能太小而无关紧要.在代码中做任何更有意义的事情.
旁注:对于比字符串或数字更复杂的对象,情况会有所不同.例如:
function getSomething() { return "something"; } function doSomething(s) { return getSomething() + s; }
显然比这更有效:
function doSomething(s) { function getSomething() { return "something"; } return getSomething() + s; }
因为在这种情况下,JS引擎必须创建"getSomething"的新实例(或者花费大量的实现+计算工作来确定可以避免这样做;我不会依赖它).差异是由于对象身份的可观察性:
"a" === "a" // true (function f() {}) === (function f() {}) // false