localStorage 存对象为啥取出来变成字符串了?
我在用 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
对象转字符串的时候,默认会调用 toString() 方法,而普通对象的 toString() 返回的就是 "[object Object]" 这鬼东西。所以你看到的现象完全符合预期,不是 bug。
localStorage.setItem('user', { name: 'Alice' }) 实际上等价于 localStorage.setItem('user', '[object Object]')
正确做法是用 JSON 来序列化:
存进去的时候:
取出来的时候:
你记的没错,确实有人可以直接存对象——那是在内存里操作 JS 对象的时候。localStorage 是浏览器提供的持久化存储,底层就是字符串键值对,跟 JS 运行时内存不是一回事。
还有个小提醒:如果你的对象里有函数、undefined、Symbol 这些特殊值,JSON.stringify 会把它们跳过。如果有循环引用的对象,JSON.stringify 会报错。这些情况需要额外处理,不过大多数普通数据对象这么用都没问题。