我知道存储js对象的方法如下:
localStorage.setItem('testObject', JSON.stringify(testObject));
// Retrieve the object from storage
var retrievedObject = localStorage.getItem('testObject');
console.log('retrievedObject: ', JSON.parse(retrievedObject));
唯一的问题是它没有通过引用保存。 有一个解决方案吗?
我希望能够做到这一点,例如:
var user = {name: "name"};
localStorage.setItem('user', JSON.stringify(user));
var retrievedUser = localStorage.getItem('user');
var userFromSession = JSON.parse(retrievedUser );
(user === userFromSession ) IS TRUE
答案 0 :(得分:1)
你所说的方式的引用(===)是指向内存中某个位置的指针。您不能序列化和反序列化对象,并期望它具有相同的对象指针。
当您序列化某些内容时,您会创建一个新字符串对象表示形式,并在反序列化时创建一个新对象,并使用自己的引用指针,该指针基于关于JSON字符串的内容。
答案 1 :(得分:1)
您无法在JavaScript中控制内存,因此没有直接的答案。
解决此问题的常用方法是使用ID
function randomId(){ return Math.floor(Math.random()*1e10) }
// mapping of ids to user objects
var _users = {};
// creates a user and assigns a random id
function createUser(params){
params.id = randomId();
_users[params.id] = params;
return params;
}
var user = createUser({name: 'foo'});
localStorage.setItem('user', JSON.stringify(user));
var userFromStorage = JSON.parse(localStorage.getItem('user'));
if (user.id === userFromStorage.id) {
// ...
}
或者您可以查看是否存在具有该ID的现有用户对象
if (_users[userFromStorage.id]) {
// set it to the existing user object
// you may wish to merge the objects, but I left that out
userFromStorage = _users[userFromStorage.id];
}
else {
// otherwise add it to the cache
_users[userFromStorage.id] = userFromStorage;
}
现在修改userFromStorage.name
将更改user.name
。