JavaScript中localStorage返回值为null,两个编辑器返回值不一样。

2021/5/19 20:58:08

本文主要是介绍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中常见的隐式转换!



这篇关于JavaScript中localStorage返回值为null,两个编辑器返回值不一样。的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程