[英]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.