JavaScript中localStorage返回值為null,兩個編輯器返回值不一樣。


------------恢復內容開始------------

問題來源:在將2048游戲發布到github pages時,發現了最高分顯示一直為null

image
當score變換了,best依舊為null

image

image
發現不管如何移動localStorge存儲的一直都是null,但是在webstorm運行時,沒有出錯,且能獲取到localStorge. vscode和github上面的都是同樣的錯誤,那一定是代碼出現了問題.

localStorge

localStorage 中的鍵值對總是以字符串的形式存儲,不受頁面刷新的影響,也不會因為關閉窗口,變遷也重啟瀏覽器而丟失,所以我選擇它來存儲最高分數.

回到設置localStorge的地方發現了錯誤原因
image
因為我最開始就沒有設置localStorage,而先去獲取這個值,在獲取不存在的localstorage時,會返回null。

localStorage.getItem("max");
null
localStorage.setItem("max",null)
undefined
localStorage.getItem("max");
"null"

然后游戲開始時,在 this.maxScore = this.maxScore > c ? this.maxScore : c;
0>null?0:null會返回null,this.maxScore=null,就把null存到了localstorage里
存的時候null就變成了"null"(String),第二次更新最高分數時,c="null",在下一步比較中 "null"轉成數字是NaN無法參與比較,
0>null?0:null
33>'null' //false,則max保存的還是null,所以最高分顯示一直為null。

測試了下null與其他值的比較
0>null 
false
null<2
true
null<0
false
null>0
false
null==0
false
null<1
true
null<'a'
false

webstorm能正常運行,,VSCODE為null

因為我前面一直在完善程序,localStorage早就已經保存了,所以在判斷時不影響。因為localStorage 中的鍵值對總是以字符串的形式存儲,不受頁面刷新的影響,也不會因為關閉窗口,變遷也重啟瀏覽器而丟失。在webstorm打開的瀏覽器手動移除localstorage后就會出現相同的問題。也可以在代碼中使用removeItem()移除。

總結

有兩種改進方法

1.使用Number()

在第一次設置localStorage時,將null轉為0,
image
注意'null'字符串是無法轉換的
image

2.在初始化時檢測一下有沒有緩存

就開始檢測一下有沒有緩存,沒有就放個0進去.

if(!localstorage.getitem('maxscore')){
	localstorage.setitem('maxscore',0)
}

不過兩種方法好像都有點點不太優雅?
出現這個問題的原因,是對localStorage的存儲已經生存周期不清楚,還有對js的類型轉換也有沒有注意到。

以后使用localStorage時,定期清除一下。注意js中常見的隱式轉換!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM