localStorage值判断异常:值为undefined时if语句仍执行
localStorage值判断异常:值为undefined时if语句仍执行
兄弟,我一眼就瞅出问题所在了——localStorage只能存储字符串类型的数据,这是核心坑点!
你说console.log(storedItem)显示是undefined,但代码还是跑进了if块,大概率是因为你拿到的不是真正的undefined类型,而是字符串"undefined"!
为啥会这样?举个例子:如果之前你不小心执行了类似localStorage.setItem('current_tenant', undefined)的代码,localStorage会自动把undefined转成字符串"undefined"存起来。这时候你用getItem取出来的就是这个字符串,打印出来看起来和undefined一样,但本质是完全不同的类型。
你写的判断条件storedItem !== undefined,对于字符串"undefined"来说,它和undefined类型不相等,所以条件会成立,代码自然就执行了。哪怕你换成!= null,因为"undefined"既不是null也不是undefined,条件还是会成立。
给你几个解决思路:
- 先判断拿到的值是不是有效字符串,排除
null和字符串"undefined"的情况:let storedItem = localStorage.getItem('current_tenant'); // 过滤掉null、空字符串和"undefined"字符串 if (storedItem && storedItem !== "undefined") { let retrievedTenant = JSON.parse(storedItem); setCurrentTenant(retrievedTenant); } - 更严谨的写法,先校验类型再判断内容:
let storedItem = localStorage.getItem('current_tenant'); if (typeof storedItem === 'string' && storedItem !== "" && storedItem !== "undefined") { let retrievedTenant = JSON.parse(storedItem); setCurrentTenant(retrievedTenant); } - 另外,你代码里的
JSON.parse(localStorage.getItem('current_tenant') || '')有隐患:如果getItem返回null,|| ''会把它转成空字符串,JSON解析空字符串会直接报错。建议改成|| '{}'(如果存的是对象)或者|| '[]'(如果存的是数组),根据你的数据结构来调整。
最后可以去浏览器控制台验证下:输入localStorage.getItem('current_tenant'),看看返回的是不是带引号的"undefined",如果是,那就是我说的这个问题啦!
备注:内容来源于stack exchange,提问作者Cjmaret
相关产品推荐
相关产品推荐

