localStorage返回NaN(而不是Number,或者什么都没有)

localStorage returning NaN (rather than a Number, or nothing at all)

本文关键字:什么 或者 Number NaN 返回 localStorage      更新时间:2023-09-26

我一直在尝试让localStorage工作,但继续受到错误的困扰。我见过几种处理本地存储的方法,也尝试过几种,但没有一种能达到预期的效果。

我最近的尝试是基于W3Schools的这个例子,但它似乎也不起作用。

var difficulty = 0;
var highscore = 0; 
function retrieveLocalData() {
    if(typeof(Storage)!=="undefined") {
        if(localStorage.highscore) { highscore = parseInt(localStorage.highscore); }
        if(localStorage.difficulty) { difficulty = parseFloat(localStorage.difficulty); }
    }
}
function storeLocalData() {
    if(typeof(Storage)!=="undefined") {
        localStorage.highscore = highscore; 
        localStorage.difficulty = difficulty; 
    }
}

我期望的是storeLocalData()检查是否支持localStorage,如果是,将highscoredifficulty存储在localStorage中。我希望retrieveLocalData()检查是否支持localStorage,检查highscoredifficulty是否分别已存储,如果是,检索值,将它们解析为Int或Float分别与parseIntparseFloat

测试时,highscore输出为NaN。

我的期望和假设是否不正确?我不确定为什么会发生这种行为。谢谢。


编辑1:

我删除了所有的localStorage值,并在修改值之前或之后的每个点添加highscore值中的console.log()。在进入retrieveLocalData()之前,该值如预期的那样为0,但是在退出retrieveLocalData()之后,该值为NaN。

编辑2:

根据apsillers的建议,我将if语句更改为if(!isNaN(parseInt(localStorage.highscore)))。代码现在运行正常:)

如果单独测试,您指定的代码可以正常工作。你可能要做的是做一个范围错误,你的highscore实际上是undefined,所以试着检查在开发人员工具(F12)的资源选项卡(chrome),在那里你可以检查什么是在本地存储。如果值是不正确的,那么你将需要检查你的storeLocalData函数,或者它也可能是什么都没有存储的情况,或者如果你在storeLocalData之前调用你的retrieveLocalData,那么undefined首先被检索(作为NaN,由于parseFloat),然后被保存(之后你会陷入循环,所以尝试改变NaN在这种情况下为0和0)。