非空判断内仍触发JSON.parse(null)报错,代码问题排查求助
问题分析与解决方案
你的问题出在判断条件只检查了localStorage.getItem("test")是否为null,但没有考虑到这个返回值可能是能被JSON.parse解析成null的字符串(比如"null"),或者是无效的JSON内容,这些情况都会让你的条件通过,但执行后续代码时触发报错。
具体错误场景拆解
当
localStorage.getItem("test")返回字符串"null"时:
你的判断!= null会成立(因为"null"是字符串类型,不是null值),此时JSON.parse("null")会返回null。虽然JSON.stringify(null)是合法操作(结果为"null"),但如果你的运行环境中localStorage处于不可写入状态(比如部分浏览器的隐私模式),调用setItem就会抛出InvalidStateError。同时,后续如果有依赖解析后值的代码,也会因为值为null而报错。当
getItem返回空字符串或无效JSON时:
空字符串""不等于null,所以条件依然成立,但JSON.parse("")会直接抛出JSON语法错误;如果是无效JSON(比如"{invalid}"),同样会触发解析错误。
修复后的代码示例
const testValue = window.localStorage.getItem("test"); // 先排除null、空字符串的情况 if (testValue != null && testValue.trim() !== "") { try { const parsedValue = JSON.parse(testValue); // 如果你想排除解析后为null的场景,再加这层判断 if (parsedValue !== null) { window.localStorage.setItem("test", JSON.stringify(parsedValue)); } } catch (error) { console.error("处理localStorage的test值时出错:", error); // 可选:遇到无效JSON时清理错误数据 // window.localStorage.removeItem("test"); } }
关键改进点
- 增加空字符串检查:避免解析空内容导致的语法错误;
- 用
try/catch包裹JSON解析:捕获无效JSON的情况,防止脚本崩溃; - 可选的解析后值判断:如果你的业务逻辑要求解析后的值不能是
null,可以加上parsedValue !== null的判断,彻底避免你遇到的场景。
内容的提问来源于stack exchange,提问作者frosty




