2016-11-20 4 views
0

우리는 다음과 같은 자바 스크립트 코드가 이러한 특정 라인할당 동작은 전체 개체에 대한 차이와 그 속성 예를 들어

o = { 
    message: "new object!" 
}; 

우리가 이름을 'O'새로운 개체를 만드는에서

function f(o) { 
    o.message = "set in f"; 
    o = { 
     message: "new object!" 
    }; 
    console.log(`inside f: o.message="${o.message}" (after assignment)`); 
} 
let o = { 
    message: 'initial value' 
}; 
console.log(`before calling f: o.message="${o.message}"`); 
f(o); 
console.log(`after calling f: o.message="${o.message}"`); 

을, 이전 줄에서

o.message = "set in f"; 

우리는 원래 개체의 특성을 na 나 '오'(그래서 내 이해에 개체 자체를 수정).

내 질문에 이러한 상황에서 할당 동작이 다른 이유는 무엇입니까? 객체 자체와 그 속성에 대해 동일해야하지 않습니까?

예를 들어 함수 본문에서 'o'할당은 새 '오'객체를 생성하는 대신 원래 'o'객체를 변경해야합니다.

+0

아니요 ... 아주 간단한 예는'{}! = {}'입니다. 각각은 다른 객체에 대한 참조가없는 새로운 객체입니다. – charlietfl

답변

2

당신이 그것에 대해 생각하면 두 경우 모두 동작이 실제로 비슷합니다. "set in f"을 할당 할 때 o.message이 이미 존재 함을 유념하십시오. 새 값은 변수 o에 객체 리터럴을 할당 할 때 이미 존재하는 것처럼 이전 값을 무시하는 것처럼 이미 존재하는 값 "initial value"o.message으로 대체합니다.

컨텍스트 측면에서 보면 동일한 내용이 사실입니다. o이 전역 변수 인 경우 브라우저에서 전역 개체의 속성으로 실제로 어느 정도까지 볼 수 있습니다 (window). 따라서 window.o이 이미 있고 o = {} (이 예에서는 window.o = {}과 동일)과 같은 할당을 수행하면 동작이 동일합니다.

모든 경우에 변수 또는 속성의 기존 값을 재정의하는 경우 변수 또는 속성이있는 컨텍스트를 수정하는 동시에 상황을 파악할 수 있습니다.

+0

좋은 설명. 유일한 차이점은 객체가 언어 값이며 전달 될 수 있지만 가변 환경은 액세스 가능 엔티티가 아니라는 점입니다. – Bergi

+0

설명에 감사드립니다. – sT331h0rs3