localStorage 存对象为啥取出来变成字符串了?

子儒 阅读 17

我在用 localStorage 存一个用户对象,结果再取出来的时候发现它变成了字符串,直接访问属性就报错了。明明存的是对象啊,咋回事?

我试过这样存:localStorage.setItem('user', { name: 'Alice', id: 123 }),但取出来用 localStorage.getItem('user') 得到的是 "[object Object]",根本没法用。

是不是得先转成 JSON?但我记得以前好像有人说过可以直接存……现在彻底懵了,到底该怎么正确存取对象?

const user = { name: 'Alice', id: 123 };
localStorage.setItem('user', user);
const saved = localStorage.getItem('user');
console.log(saved.name); // 报错:Cannot read property 'name' of undefined
我来解答 赞 1 收藏
二维码
手机扫码查看
1 条解答
艳苹
艳苹 Lv1
这个问题很常见,localStorage 确实只能存字符串,它内部会把你传的值强制转成字符串类型。

对象转字符串的时候,默认会调用 toString() 方法,而普通对象的 toString() 返回的就是 "[object Object]" 这鬼东西。所以你看到的现象完全符合预期,不是 bug。

localStorage.setItem('user', { name: 'Alice' }) 实际上等价于 localStorage.setItem('user', '[object Object]')

正确做法是用 JSON 来序列化:

存进去的时候:
const user = { name: 'Alice', id: 123 };

// 存之前先转成 JSON 字符串
localStorage.setItem('user', JSON.stringify(user));


取出来的时候:
// 取出来的是字符串,需要再转回对象
const saved = localStorage.getItem('user');
const user = JSON.parse(saved);

console.log(user.name); // 'Alice'
console.log(user.id); // 123


你记的没错,确实有人可以直接存对象——那是在内存里操作 JS 对象的时候。localStorage 是浏览器提供的持久化存储,底层就是字符串键值对,跟 JS 运行时内存不是一回事。

还有个小提醒:如果你的对象里有函数、undefined、Symbol 这些特殊值,JSON.stringify 会把它们跳过。如果有循环引用的对象,JSON.stringify 会报错。这些情况需要额外处理,不过大多数普通数据对象这么用都没问题。
点赞
2026-03-18 11:14