簡體   English   中英

StandardJS 未將 array.push() 識別為重新分配

[英]StandardJS not recognising array.push() as reassignment

我在循環之前聲明了一個空數組,然后在循環運行時填充該數組。 我的代碼工作正常,但是當我使用 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++
  }
}

我在這里錯過了什么嗎?

您可以並且應該使用const

const這個名字有點用詞不當——它只是說變量一旦聲明,就不能重新聲明或重新分配——也就是說,它總是指向 memory 中相同的 object(或更一般地說,總是與首次創建時)有關進一步說明,請參閱MDN 上的這篇文章

但是請注意,object 可以是可變的,即使它被聲明為 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++
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM