2017-03-10 9 views
0

내가 좋아하는 것이지도 기능을 호출하지 않고 설정 설명 : ES6지도 map.set()

let m = new Map().set('items', ["a", "b", "c"]); 

console.log(m.get('items')); // ["a", "b", "c"] 

let n = m.get('items'); 

console.log(n); // ["a", "b", "c"] 

n.push("d"); 

console.log(n); // ["a", "b", "c", "d"] 

console.log(m.get('items')); // ["a", "b", "c", "d"] 

어떻게 값이 Map.set()를 호출하지 않고 m를지도에 추가 취득 'D'습니까?

답변

2

배열이 하나뿐이므로 m.get('items')이 실행될 때 복제되지 않고 배열에 대한 참조가 제공됩니다.

이 같은 일을하여 확인할 수 있습니다 :

n === m.get('items') // returns true

반대로, 두 배열은 그들이 아무것도 포함하지 않는 경우에도 동일하지 않습니다. 예를 들어 :

[] === [] // returns false

아주 멋진,이 동작을 알고 아니었지만, 그것은 의미가 있습니다. 좋은!

+0

감사합니다. 그것은 내 직감이었습니다. 지도에서 가져온 배열의 변경 사항을 비교하려고 시도한 후에 나중에 원본 (원래 이해할 수있는) 매핑 된 버전과 비교합니다. 희망이 맞는가 – mhakes

+0

@EranSch 예, 역 참조 유형 (e.q 객체 또는 배열)의 JS 값은 메모리의 동일한 위치에 대한 참조를 저장하는 경우에만 동일하게 간주됩니다 (둘 다 동일한 인스턴스를 나타냄). 그리고'[] === []'는 두 개의 분리 된 배열 인스턴스를 생성합니다. –

1

n 때문에 변수 저장이 m 맵에 저장된 배열 참조 (그것을 복사시) - 그래서 n 변수에 저장한다 갱신 바라본다 물론 동일한 배열 push 방법 m 맵 저장 refernce를 갖는 정규 배열 정렬. 따라서 n 변수와지도 items 동일한 배열을 참조하십시오. 이는 모든 JS 참조 유형에 대한 일반적인 동작입니다. m이 기본 유형 (예 : 문자열)의 저장된 값을지도에 표시하려면 set을 사용하여지도에서 업데이트해야합니다.

+0

동의하는, 푸시 방법을 말하지만, 나중에 오는 map.get(). 명시 적으로 m.set ('items', [ "a", "b" "c", "d"])라고 말하지 않고 'd'값을지도 키/값 쌍 'items'에 어떻게 포함 시켰습니까? – mhakes

+0

@mhakes 배열은 객체이기 때문에이 맵에 저장되는 것은이 객체에 대한 참조입니다. 이것은 특히지도와 관련이 없지만 JS가 일반적으로 작동하는 방식과 관련이 있습니다. – estus

+0

@EranSch와 @estus는 모두 같은 것을 말하고 있습니다. 당신은지도가 클래스처럼 행동했고 호출되지 않으면 실행하지 않을 것이라고 생각했던 '클래스 유사'라고 생각했던 기본적인 JS 동작이 맞습니다. 호출 된 참조가 올바른 용어가 아니며 선천적입니다. – mhakes