【问题标题】:JavaScript loop best practiceJavaScript 循环最佳实践
【发布时间】:2018-06-14 08:17:31
【问题描述】:

我正在做一个tutorial on JavaScript。以下是关于性能的部分:

循环中的每个语句,包括 for 语句,都会在循环的每次迭代中执行。 可以放在循环之外的语句或赋值将 使循环运行得更快。

这是一个错误代码的例子:

var i;
for (i = 0; i < arr.length; i++) {

这是一个好的代码示例:

var i;
var l = arr.length;
for (i = 0; i < l; i++) {

我记得这不是我认为比 JavaScript 更注重性能的语言的最佳实践。事实上,bad code 的例子似乎更受欢迎。

这种最佳实践是 JavaScript 特有的,还是其他语言也是如此?

【问题讨论】:

  • 对于更长的数组,最好缓存长度。我个人更喜欢将变量放在一起,并且由于歧义而从不使用 l 作为变量名称:for (var i=0, n=arr.length; i&lt;n; i++) { - 如果迭代改变了数组的长度,那么你不需要缓存长度
  • 无论语言如何,它都应该是可取的——你不想在每次迭代时检查数组的length(除非你期望它改变),最好把将数组的长度放入一个变量中,然后检查该变量。也就是说,您应该考虑一个比 W3schools 更好的教程网站,W3schools 是出了名的不可靠
  • 说实话,这取决于语言。甚至对于 JavaScript 的每个实现来说都不是真的。如果数组的长度参数在访问时是静态的(而不是在访问时计算),则创建新变量只会使用更多内存。如果参数在每个请求上都重新计算,那么您将节省计算时间。
  • 更好的参考是MDN
  • 您对“最佳”的标准是什么?所谓的“最佳实践”只能根据“最佳”的一些标准来确定,例如鲁棒性、可靠性、可维护性等。除非特别关注性能,否则性能应该在列表中。

标签: javascript performance loops


【解决方案1】:

不好的做法

for (i = 0; i

对于循环中的每次迭代,都会评估条件。如果它是arr.length,那么每次您尝试从arr 访问length 属性时。然而,另一方面,如果你将它存储在一个变量中,你就避免了该操作。

【讨论】:

  • 如果数组在循环中改变长度,这是一个好习惯。
  • 我同意,这是有道理的。我只是好奇为什么据我所知,为什么不推荐或用其他语言提及。例如,看看如何在 C++ 中迭代一个向量。
  • @NinaScholz - 我认为在 for 循环中更改数组的大小是不好的做法 :) 我相信方法是倒数
  • 如果数组总是很小,比如少于 1000 个元素,那么缓存 length 和在每次迭代中读取它之间的性能差异可能是微不足道的(并且可能是针对长度不变的简单循环进行了优化)。
【解决方案2】:

在所有的 javascript 循环方式中,我认为 for-in 循环是最安全的。

它可以遍历对象中的属性。

let user = {first:"billy", last:"bob"};
for(let i in user){
    console.log(i);
    console.log(user[i]);
}

如果变量为null,它不会抛出错误

let empty = null;
for (let i in empty){
}

它适用于数组

let arr = [3,2,1];
for (let i in arr){
    console.log(i);
    console.log(arr[i]);
}   

.map 。筛选 。减少 .forEach 抛出除数组以外的任何错误(null、对象等)

因此,如果您想要一个适用于所有情况的循环,那么 for-in 就是您想要的。

【讨论】:

    猜你喜欢
    • 2018-09-23
    • 1970-01-01
    • 2011-06-11
    • 2012-09-20
    • 2019-03-16
    • 1970-01-01
    • 2014-05-27
    • 2011-02-23
    相关资源
    最近更新 更多