StandardJS 未将 array.push() 识别为重新分配

StandardJS not recognising array.push() as reassignment

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

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

我是不是遗漏了什么?

可以,并且应该使用const

名称 const 有点用词不当 - 它只是说变量一旦声明,就不能重新声明或重新分配 - 也就是说,它总是指向内存中的同一个对象(或更一般地说,始终与首次创建时的值相同)有关详细说明,请参阅 this post on MDN.

但是请注意,对象可以是可变的,即使它被声明为 const。仅仅因为 primeFactors 总是指向同一个数组并不意味着数组不能 grow/shrink/change.

在我的 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++
  }
}