localstorage只支持字符串键值对,原始类型必须用json.stringify()序列化、json.parse()反序列化,并用try...catch处理解析异常,避免隐式转换和undefined直接存储。

JavaScript原始类型(如字符串、数字、布尔值、null、undefined)存入 localStorage 时,必须转为字符串,因为 localStorage 只支持字符串键值对。这是最核心的规范,所有操作都围绕它展开。
原始类型必须显式序列化
localStorage.setItem(key, value) 的 value 参数会被自动调用 .toString(),但行为不统一,容易出错:
- 字符串:直接存储,无问题
-
数字:如
42→"42",可接受;但NaN→"NaN",Infinity→"Infinity",恢复后不是原始值 -
布尔值:
true→"true",false→"false",看似合理,但取回时仍是字符串,需手动转换 -
null:→
"null",和字符串"null"无法区分 -
undefined:→
"undefined",同上,语义丢失
✅ 正确做法:统一使用 JSON.stringify() 序列化,确保可逆且语义明确。
读取时必须反序列化并校验
localStorage.getItem(key) 返回的是字符串,即使你存的是数字或布尔值。不能直接使用,需解析并处理异常:
- 用
JSON.parse()解析,而非依赖隐式转换(如+str或Boolean(str)) - 必须包裹
try...catch,因为数据可能被手动篡改或损坏 - 对
null和undefined要特殊处理:它们经JSON.stringify()后分别是"null"和"undefined"字符串,但后者JSON.parse("undefined")会报错,所以建议避免存undefined
示例安全读取:
function getStoredValue(key) {
const str = localStorage.getItem(key);
if (str === null) return undefined;
try {
return JSON.parse(str);
} catch (e) {
console.warn(`Invalid JSON in localStorage[${key}]:`, str);
return undefined;
}
}
慎用 typeof 判断原始类型再分支处理
有人试图根据 typeof value 分类处理(比如字符串不序列化、数字用 String()),但这会破坏一致性,增加维护成本,且无法覆盖 null 等边界情况。
- 统一走
JSON.stringify() / JSON.parse()流程,逻辑清晰、可预测 - 若需存储
undefined,建议用null替代(JSON 支持),或约定用特殊字符串如"__UNDEFINED__"并在读取时识别 - 注意
Symbol、函数、对象、日期等非原始类型——它们不属于本文范围,但若误传会静默转为"[object Object]",务必避免
注意大小写与空格敏感性及编码兼容性
localStorage 键名严格区分大小写,值内容保留原始 JSON 格式中的空格和换行(虽然通常压缩)。此外:
- 中文、emoji 等 Unicode 字符可正常存储,无需额外编码(浏览器内部用 UTF-16 处理,但对外透明)
- 不要对原始值再套一层
encodeURIComponent()——JSON.stringify()已处理特殊字符,多层编码反而导致解析失败 - 键名避免使用空格、点号、斜杠等,在跨平台或未来迁移到 IndexedDB 时更稳妥
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











