游戏保存加载模块异常:挖矿时出现NaN值问题求助
我帮你找到了挖矿数值变成NaN的核心原因,也整理了完整的修复步骤,咱们一步步来解决:
首先,问题出在**save()函数处理localStorage数据的逻辑上**:当你第一次打开页面,或者localStorage里还没有保存过数据时,localStorage.getItem()会返回null,而parseInt(null)的结果是NaN。一旦satoshi、dash这类变量变成了NaN,后续的加法运算(比如satoshi = satoshi + hash)结果自然也会变成NaN,这就是你看到的异常。
具体修复步骤
1. 修复save()函数,给空值加默认兜底
修改save()函数,在解析localStorage数据时添加默认值,避免出现NaN:
function save() { // 用||运算符处理空值:如果parseInt返回NaN,就用后面的默认初始值 dash = parseInt(localStorage.getItem("dash")) || 0; satoshi = parseInt(localStorage.getItem("satoshi")) || 0; dhash = parseInt(localStorage.getItem("dhash")) || 1; hash = parseInt(localStorage.getItem("hash")) || 1; }
这里的逻辑是:如果localStorage里没有对应数据,就用你最初设定的初始值(0或1),保证变量永远是有效的数字。
2. 页面加载时同步更新显示
现在页面加载时只调用了save(),但没有立刻更新页面上的数值显示,导致页面显示和实际变量值不一致。修改HTML的onload事件:
<body onload="save(); update(); updates()" onunload="boop()">
这样页面加载后,会先加载保存的数据,再立刻把最新数值渲染到页面上。
3. 优化定时器逻辑(可选但推荐)
你当前用setTimeout递归调用的方式容易产生定时器堆积,换成setInterval会更清晰稳定,比如修改BTC挖矿相关的函数:
function update() { document.getElementById('hashspersecond').innerHTML = "Satoshis: " + satoshi; } function minebtc() { satoshi = satoshi + hash; update(); } // 重构启动挖矿的逻辑,避免重复创建定时器 function startMineBtc() { stop(); minebtcTimer = setInterval(minebtc, 1000); } function stop() { clearInterval(minebtcTimer); }
对应的HTML按钮也要改成调用新的启动函数:
<button onclick="startMineBtc()"><img src="kop.png" height=28 width=32>Mine BTC</button>
同理可以修改DASH的挖矿逻辑,这样代码更易维护,也不会出现多个定时器同时运行的问题。
验证效果
修复完成后,第一次打开页面会使用默认初始值,挖矿时数值正常增长;刷新页面后会加载之前保存的数据,继续正常挖矿,再也不会出现NaN的情况了。
内容的提问来源于stack exchange,提问作者mahan lorik

