localstorage只能存储字符串,存对象需先json.stringify序列化,读取时用json.parse解析;函数、undefined等无法直接保存,date需手动转换;必须用try...catch防止解析失败。

直接用 localStorage.setItem 存对象会出错,因为本地存储只支持字符串。必须先用 JSON.stringify 把对象转成字符串,再存;读取时再用 JSON.parse 还原。
为什么不能直接存对象?
localStorage 的值只能是字符串。如果传入对象(比如 {name: "张三", age: 25}),JavaScript 会自动调用 toString(),结果变成 "[object Object]"——原始数据彻底丢失。
正确写法:存和取的完整流程
存的时候:
- 用
JSON.stringify(obj)将对象序列化为合法 JSON 字符串 - 用
localStorage.setItem(key, string)存入
取的时候:
将一个或多个视频上传至YouTube。当用户想“上传到YouTube”“发YouTube”“批量上传”“upload to YouTube”“post videos to YouTube”或发布到YouTube时使用此技能。
- 用
localStorage.getItem(key)拿到字符串 - 用
JSON.parse(string)解析回对象(注意加try...catch防解析失败)
示例:
const user = { name: "李四", hobbies: ["读书", "游泳"], settings: { theme: "dark", notify: true } };
localStorage.setItem("user", JSON.stringify(user));
// 读取
const saved = localStorage.getItem("user");
const userData = saved ? JSON.parse(saved) : null;
处理特殊值:函数、undefined、Symbol、Date 等
JSON.stringify 会忽略对象中的函数、undefined、Symbol 键或值;Date 会被转成 ISO 字符串(可接受),但还原后是字符串而非 Date 实例。
- 若需保留
Date,读取后手动用new Date(str)转换 - 函数和
undefined无法原样保存,需提前转换(如用字符串标记、或改用可序列化的结构) - 可传入
replacer函数定制序列化逻辑,例如把Date自动转为时间戳
例如:
const data = { time: new Date(), fn: () => {}, id: undefined };
const json = JSON.stringify(data, (key, val) => {
if (val instanceof Date) return val.getTime();
if (typeof val === "function" || val === undefined) return null;
return val;
});
// 结果:{"time":1712345678900}
安全读取:避免解析失败崩溃
用户可能手动修改 localStorage 或数据被意外损坏,JSON.parse 遇到非法 JSON 会直接报错。务必包裹 try...catch:
function getFromStorage(key) {
const str = localStorage.getItem(key);
if (!str) return null;
try {
return JSON.parse(str);
} catch (e) {
console.warn(`解析 ${key} 失败`, e);
return null;
}
}










