2017-03-29 3 views
1

는 바인딩 가져 오기가있는 경우 첫 번째 않을 것 ... 난 JS 수입이 실제로 쓰기 가능 (불변하지 않음) 것을 elsewhere을 읽었습니다,JS 가져 오기가 변경되지 않거나 쓸 수 있습니까? 내가 무엇을 말할 수에서

import { foo } from './foo'; 
... 
foo.bar = 23; // works 
... 
foo = { bar: 23 }; // syntax error 

그러나 불변 할당 문, foo.bar = 23;도 구문 오류가 발생합니까?

UPDATE (지금은 그것을 이해하는 방법)

... @FelixKing하여 훌륭한 대답을 의역 할을

JS 수입 (등 변수, 함수) 내 보낸 일에 불변 바인딩은 .

프리미티브가 아닌 가져 오기의 경우 가져온 개체의 속성이 반드시 변경 가능하거나 쓸 수없는 것은 아닙니다.

답변

6

이 경우 첫 번째 할당 문 foo.bar = 23; 또한 구문 오류가 발생합니까?

비 기록 가능 값 자체는 장소 여부에 를 변경할 수 있는지 여부 (불변)로서 가변 설명하는 변수의 값을 말한다.

당신이 알아 낸대로 수입을 쓸 수 없습니다. 그러나 가져 오기 값을 변경할 수 있으면 값을 업데이트 할 수 있습니다.

foo.bar = 23; 

foo에 새 값을 할당하지 않습니다. 이고 값은 foo이고이를 (속성을 추가하거나 겹쳐 쓰면서) 수정합니다. 당신이

var oldFoo = foo; 
foo.bar = 23; 
oldFoo === foo; // true 

을 한 경우에 당신은 true을 얻을 것입니다. 이는 foo에 여전히 동일한 값이 할당되었음을 나타냅니다. 그것은 단지 값 (객체)을 제자리에 업데이트했습니다.

모든 개체는 Object.freeze 또는 유사한 기능으로 전달되지 않는 한 변경할 수 있지만 원시 값 (문자열, 숫자 등)은 모두 변경할 수 없습니다.

+0

감사합니다. JS 임포트에는 불변 바인딩이 있지만 임포트 된 객체 자체는 변경 가능/비 쓰기 가능이라고 말하는 것은 맞습니까? – sfletche

+0

예, 가져 오기 바인딩은 변경할 수 없지만 개체는 기본적으로 변경할 수 있습니다. –

+0

우수! 그리고 쓸 수 없다는 것은'foo'가 벌써'bar' 프라퍼티를 (import 전에) 정의했다면, 위와 같이'foo.bar = 23'도 구문 에러를 던질 것이라는 것을 의미합니다. (이 할당 문은'foo'가 이미'bar' 속성을 가지고 있지 않을 때만 성공합니다.) 맞습니까? – sfletche