2017-09-07 2 views
0
을 변화

나는이처럼 보이는 리셋 값을 가지고 사용 목적이 있습니다개체 할당 값

let team1 = cleanTeam; 
:

export const cleanTeam = { 
    id: "", 
    name: "", 
    players: [] 
} 

그럼 내가 다음과 같습니다 cleanTeam을 사용하여 새 개체를 만듭니다 ,

team1.id = 123; 
team1.name = "My New Team"; 

나중에 :

나는 다음과 같은 team1에서 속성 값을 설정합니다 나는 cleanTeam을 사용하여 team2을 생성하므로 같은 구조이지만 값은없는 새로운 객체를 갖습니다. 그러나, 나는 할당 된 값이 cleanTeam에 있다는 것을 알아 차렸다. 즉, 내 cleanTeam 지금은 다음과 같습니다 : 나는 team1에 값을 설정 한

{ 
    id: 123, 
    name: "My New Team", 
    players: [] 
} 

이 남아 있지 않게 cleanTeam해야

?

나는 이런 일이 벌어진 이유를 알고 있습니다. 나는 cleanTeamteam1이 모두 같은 객체를 가리키고 있다고 생각한다. cleanTeam 오브젝트 을 깨끗하게 유지하려면을 유지해야하나요?

+0

"* I cleanTeam을 사용하여 새로운 객체를 만듭니다 :'let team1 = cleanTeam;'* "- 아니요, 그것은 동일한 객체를 참조하는 두 번째 변수입니다. – Bergi

답변

1

개체는 참조 유형입니다. 하나의 객체를 다른 객체에 할당하면 참조 만 복사됩니다. 따라서 실제로는 동일한 객체를 참조하는 두 개의 참조가 있습니다.

두 개의 문이있는 방을 고려하십시오. 첫 번째 문을 통해 들어와 방을 변경 한 다음 두 번째 문에서 들어가면 변경 내용이 표시됩니다.

첫 번째 수준 값을 복사하려면 Object#assign 함수를 사용할 수 있습니다. 그러면 속성이 복사됩니다. 그러나 객체 안에 객체가 있다면 참조 유형 인 players의 경우에만 참조를 복사합니다.

const cleanTeam = { 
 
    id: "", 
 
    name: "", 
 
    players: [] 
 
}; 
 

 
const newObj = Object.assign({}, cleanTeam); 
 

 
newObj.id = 1; 
 

 
console.log(cleanTeam, newObj);

왜 JSON.parse (JSON.stringify()) 솔루션을 사용하지 않는?

그것은하지 않습니다 복사 기능, JSON 만 저장 상태하지 기능 때문이다. 개체의 복사본을 만들려면

const a = { 
 
    id: 1, 
 
    func: function(){ 
 
    console.log('Hello'); 
 
    } 
 
}; 
 

 
a.func(); 
 

 
const b = JSON.parse(JSON.stringify(a)); 
 

 
b.func(); // Error

+0

JSON.parse (JSON.stringify()) 솔루션에 대한 좋은 지적 –

+0

당신은 절대적으로 옳습니다! 당신이 언급 한 요점은 객체 내에 객체가 있다면 말입니다. 내 'cleanTeam'이 다른 객체 안에 있기 때문에'Object.assign()'을 사용하고 있었고 내'cleanTeam'이 여전히 업데이트 중입니다. 이해하기 쉽게 코드를 단순화했습니다. 'JSON.parse (JSON.stringify()) '를 사용하여 문제가 해결되었습니다. 멋지고 상세한 설명에 감사드립니다! – Sam

1

는 수행 원래 하나에 대한 참조가 그래서
var team1 = JSON.parse(JSON.stringify(cleanTeam))

이 트릭은 메모리에 다른 주소를 가리키는 새로운 객체를 생성 잃어버린.귀하의 경우에는

,이 작동하지만 염두에 두어야 할 것이다 수렌는 말 : 그것은 기능을 복사하지 않습니다

때문에 JSON 만 저장 상태가 아닌 기능