0

我在循环之前声明了一个空数组,然后在循环运行时填充该数组。我的代码工作正常,但是当我使用 StandardJS 进行 lint 时,它告诉我数组永远不会重新分配,应该声明为 const。如果我这样做了,那么我将无法向我的数组添加值,并且我的代码将无法工作。这也意味着我不能使用标准 --fix因为它破坏了我的代码。

let primeFactors = []
while (number > 1) {
  if (isPrime(divisor)) {
    if (number % divisor === 0) {
      primeFactors.push(divisor)
      number = number / divisor
    } else {
      divisor++
    }
  } else {
    divisor++
  }
}

我在这里错过了什么吗?

4

1 回答 1

1

您可以并且应该使用const.

这个名字const有点用词不当——它只是说变量一旦声明,就不能重新声明或重新分配——也就是说,它总是指向内存中的同一个对象(或者更一般地说,总是与它是第一次创建的)有关进一步的解释,请参阅MDN 上的这篇文章

但是请注意,该对象可以是可变的,即使它被声明为 const。仅仅因为primeFactors总是指向同一个数组并不意味着该数组不能增长/缩小/改变。

在我的 javascript 中,我的变量很少let——我const几乎在任何地方都使用,这使得代码更容易阅读和推理。(我唯一使用let的是每个循环的偶尔使用,以及偶尔使用的辅助算法方法)

因此,linter 在技术上是正确的,并鼓励最佳实践 - 例如,linter 可以保护您免受以下代码的影响 - 这会导致例如Uncaught TypeError: Cannot read property 'push' of null

let primeFactors = []
while (number > 1) {
  if (isPrime(divisor)) {
    if (number % divisor === 0) {
      primeFactors.push(divisor)
      number = number / divisor
    } else {
      divisor++
      primeFactors = null // There's no reason to do this, but it's theoretically possible!
    }
  } else {
    divisor++
  }
}
于 2020-07-04T01:05:05.697 回答