这个问题不是问题,而是基于代码结构的V8优化探索。
另一位开发人员和我正在讨论V8编译优化中 const字符串文字与内联字符串文字的价值。 当然,假设我们总是处于严格模式。
以下是一些代码示例:
const NAME = "something";
function doSomething(s) {
return NAME + s;
}
VS
function doSomething(s) {
return "something" + s;
}
我们同意:
- const为魔术值提供更多上下文,这样可以简化维护。
我们不同意:
我说使用 const 允许V8进行编译时 因为保证了常量,所以对代码进行了优化 价值不能改变。
他说,对于V8编译器,内联字符串 litteral是相同的(如果不是更好,因为间接减少)。因为在引用这样的内联字符串时可以同样应用相同的优化。
给它一点思考我倾向于同意他......每次调用函数时都会重新实例化字符串文字,但是V8可以很容易地对其进行优化,并避免后续调用。但是,我并不是所有关于编译器和编译器优化的知识都很熟悉。
有人可以对此有所了解吗?
答案 0 :(得分:10)
V8开发人员。
即使在未经优化的代码中,内联字符串也在所有函数调用中共享,因此无需担心重新实例化。
一般来说,JS引擎弄清楚文字永远不会改变(因为它们是文字,呃!)是微不足道的。 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