通过引用将js对象保存在存储中

时间:2014-10-30 16:15:09

标签: javascript local-storage

我知道存储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

2 个答案:

答案 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