참조

2014-10-30 1 views
0

하여 스토리지 JS 객체 저장이 같은 가게 JS 개체에 대한 방법을 알고있다. 해결 방법이 있습니까?참조

내가 예를 들어이 작업을 수행 할 수 있도록하려면 :

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

"참조로 저장 됨": 이것으로 무엇을 의미합니까? – Andy

+0

또한이 방식으로 해결하려는 문제는 무엇입니까? – aw04

+0

질문을 업데이트하십시오. –

답변

1

당신이 (===) 그것을 말하는 방식에 대한 참조는 메모리의 위치에 대한 포인터입니다. 개체를 serialize 및 deserialize하고 동일한 개체 포인터를 가질 것으로 기대할 수 없습니다. 당신이 뭔가를 직렬화 할 때

당신은 그것의 새 문자열 오브젝트 표현을 생성하고 역 직렬화 할 때 당신은 JSON 문자열의 내용을 기반으로 자신의 참조 포인터, 더불어 새로운 객체를 만듭니다.

+0

고마워요. 다른 방법으로 이것에 어떤 방법이 있습니까? –

+0

@ student1001은 메모리에서 같은 위치를 차지하고 있는지 또는 "평등"이라는 다른 허용 가능한 정의가 있는지 알 필요가 있는지 여부에 따라 달라집니다. – aw04

+0

@ aw04를 통해 답변을 확장하십시오. 당신의 객체는 오직 하나의 'name'속성만을 가지고 있기 때문에'new.name == old.name'이라면 그것들은 같다고 생각할 수 있습니다. 그러나 결코 같은 단일 객체가 될 것입니다. –

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) { 
    // ... 
} 

함께 또는 기존 사용자 개체 지금 userFromStorage.name을 수정하면 user.name 변경됩니다 해당 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; 
} 

존재 여부를 알 수 있습니다.