localStorage只能存储字符串,原始类型需用JSON.stringify()存、JSON.parse()取;undefined需特殊处理为标记字符串;封装工具函数可确保类型准确和边界安全。

JavaScript原始类型(如字符串、数字、布尔值、null、undefined)不能直接存入 localStorage,因为它的值必须是字符串。存储前需显式转换,读取后需按需解析,否则会导致数据失真或运行时错误。
字符串、数字、布尔值:统一用 JSON.stringify() 和 JSON.parse()
这是最推荐、最安全的通用方式,能准确保留类型和值语义:
-
存储时:对原始值调用
JSON.stringify(value),再存入localStorage.setItem(key, ...) -
读取时:先用
localStorage.getItem(key)获取字符串,再用JSON.parse()还原为原始值 - 例如:
localStorage.setItem('count', JSON.stringify(42))→ 读取后JSON.parse(localStorage.getItem('count')) === 42(number 类型) - 注意:
undefined经JSON.stringify(undefined)会变成"null",还原后是null而非undefined,需单独处理
null 和 undefined 的特殊处理
二者在 JSON 中表现不一致,且 localStorage 无法区分“未设置”与“存了空值”:
-
null可安全使用JSON.stringify(null) → "null",JSON.parse("null") → null -
undefined不能被 JSON 序列化:JSON.stringify(undefined)返回undefined(不是字符串),直接赋值会转为空字符串 建议统一转为null存储,或用特殊标记字符串(如"__UNDEFINED__")并在读取时识别还原 - 若需区分“键不存在”和“值为 null/undefined”,读取时应检查
getItem()返回是否为null
避免隐式类型转换陷阱
不要依赖 String()、Number() 或 Boolean() 等强制转换,它们会丢失原始语义:
立即学习“Java免费学习笔记(深入)”;
- 错误示例:
localStorage.setItem('flag', true)→ 自动转为字符串"true";读取时localStorage.getItem('flag') === "true"(字符串),不是布尔值 - 更危险的是数字:
localStorage.setItem('id', 0)→ 存为"0";若后续用Number(...)解析,0没问题,但""、"abc"会变成NaN,而JSON.parse()会直接报错,更早暴露问题 - 布尔值
false转字符串也是"false",但若误用!!"false"会得到true—— 逻辑完全反转
封装一个安全的工具函数
推荐封装成可复用的方法,统一处理边界情况:
const LS = {
set(key, value) {
if (value === undefined) {
localStorage.setItem(key, '__UNDEFINED__');
} else {
localStorage.setItem(key, JSON.stringify(value));
}
},
get(key) {
const str = localStorage.getItem(key);
if (str === null) return undefined;
if (str === '__UNDEFINED__') return undefined;
try {
return JSON.parse(str);
} catch {
return str; // 解析失败时退回原始字符串(兼容旧数据)
}
}
};
使用:LS.set('isActive', false) → 读取 LS.get('isActive') 得到布尔 false,类型准确、行为可预测。










