【问题标题】:Why is this way of working with an array not optimal?为什么这种处理数组的方式不是最优的?
【发布时间】:2018-05-11 08:15:12
【问题描述】:

今天我的 cs 课结束时,我的老师向我们展示了这段代码,并要求我们思考为什么它不是最优的。

代码如下:

for (var x = 0; x < array.length; x++) {
        console.log(array[x]);
}

我不知道出了什么问题。我认为使用 'forEach' 可能会更好,但我不确定为什么?

Something like this?:

array.forEach(function(element) {
        console.log(element);
});

【问题讨论】:

  • 在代码行数过多或效率低下的意义上不是最优的?同样使用forEach,您可以将其缩短为array.forEach(console.log),但这只是代码行更短,它仍然会循环
  • 还有一个论点是 forEach() 将是内部最优的,因此 JIT 编译器要做的工作更少。此外,您有一个错误,使用x 作为循环变量,但使用array[i] 作为索引;这在功能性案例中是不可能的。 ;-) 另一方面,您可能会因为手指打滑而将element 拼写为emelent,但希望您会收到有关未使用函数参数的警告。
  • 好吧,首先,它坏了。您使用 i 作为索引,但在迭代器中使用 x。但是“最优”很大程度上是基于上下文的——最优如何?快点?阅读更清晰?更正确?更安全?使用最新的语言功能?更可组合?
  • 对不起,本来是x

标签: javascript arrays


【解决方案1】:

你可能会选择:

for(const el of array) { /*...*/ }

为什么这样更好?好吧,您只需要查看一次,就可以知道它会在每个el of array 执行块for。它的阅读速度比:

for(let i = 0; i < array.length; i++) {
  const el = array[i];
  /*...*/
}

由于编程语言主要是为了便于人类理解,因此您应始终尝试使代码尽可能易读。如果代码更具可读性,也更容易发现代码中的错误,从而提高安全性、可维护性和开发时间。

【讨论】:

  • 这是我放在一起用于评估访问数组长度的 jsperf。 JSPerf Setup。抱歉在这里发表评论。我们讨论这个问题的原始答案现在已被删除
  • @chirag 导致 chrome 在 andrpid 上崩溃,结果如何?
  • 我现在其实有点迷茫。我最初的几次试验支持了我最初的建议,即只访问一次长度会更快。但是当我再运行几次时,它是双向的。不知道这个结果是如何变化的。老实说,我真的希望它是一个或另一个
  • Related Question on StackOverflow 对此有所了解。也请参阅未接受的答案
  • @chirag 他们都认为它不值得缓存长度。所以我的观点仍然有效
【解决方案2】:

通过保留for 循环,您可以省略increment operator ++ 的后缀与前缀语法的不同返回值。

x++ // take value, then increment, slower 
++x // increment, take value, faster

【讨论】:

    【解决方案3】:

    您应该将长度放入变量中,而不是在循环中将其用作 array.length。 IE。 var length = array.length. for(let i = 0; i < length; i++)

    【讨论】:

    • 为什么要“更好”?!
    猜你喜欢
    • 2021-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多