ES6 JavaScript - const inside 还是 let outside 循环?

ES6 JavaScript - const inside or let outside loop?

出于性能考虑,我想知道在 ES6 JavaScript 之间有什么区别:

var list = [...];
let item; //let outside the loop
for (let i = 0; i < list.length; i++) {
    item = list[i];
}

var list = [...];
for (let i = 0; i < list.length; i++) {
    const item = list[i]; //const inside the loop
}

假设 item 变量在循环内保持不变。

有推荐的吗?相对于每种性能的优缺点是什么? GC 是否以不同方式处理它们?

请注意,这是微优化。此外,性能取决于所使用的 JS 引擎。(查看答案)

在第一个示例中,item 的作用域在循环之外,因此分配的最终值将在任何封闭作用域中可用。在后一个示例中,item 在循环结束后未定义。您也将无法在循环内重新分配 item,因为它是 const 而不是 let.

就个人而言,我会使用第二种,除非有理由使用第一种。性能差异很小,但由于对变量分配的额外需求,稍微 更差。

免责声明:我现在认为以下是推测,并且会犹豫建议应该选择它作为答案,直到它可以被证实。在那之前,我会把它放在这里以供评论和确认;如有不妥将被删除


有两件事需要考虑:

  1. let 对比 const
  2. 循环内的变量声明

两者都将取决于浏览器的实现,因此性能并不是一成不变的;但是,通常第一个(在循环外声明 let)应该产生更有效的结果,因为声明变量通常比单独赋值需要更多的 OPS。

需要注意的是,结果的效率会受到多种因素的影响。这些包括但不限于:

  • 用于执行代码的系统资源
  • 执行的操作类型(如果与初始示例不同)
  • 列表的长度及其值的大小

虽然很难确定代码的效率会提高多少,但重要的是要注意在平均条件下(具有至少 2GB RAM 的平均多核桌面)和平均大小的列表(例如, 5k 个元素), 结果的差异将是纳秒到微秒, 考虑到这种差异通常被认为是微观优化。

考虑到不同的浏览器具有截然不同的内部实现,因此很难给出明确的答案。很可能是零差异。在执行之前,浏览器中的 Javascript 由内部 JIT 编译器编译,它很可能会识别循环内的冗余变量声明并将其优化掉,就像任何其他好的编译器一样。 letconst 肯定会影响这一点,我想说 const 会更有可能考虑到编译器可以立即看到它是一个特定于内循环范围。 它还可能展开性能密集型循环。 Javascript 还有一些其他的性能怪癖,尽管在更高范围内访问变量会导致轻微的性能损失,我记得很久以前在浏览器中执行 gamdev 时研究过这个问题。那可能不再是最新的了,但那是几年前的事了。

正如其他人指出的那样,除非分析已经表明这是您应用程序中的严重瓶颈,否则它是过早的优化。如果优化它可能带来任何显着的性能优势,我会感到非常震惊。如果这方面的性能很重要,最好的建议是自己分析不同的场景并确定最适合您的用例的场景。