객체 리터럴을 사용하여 키-값 쌍을 저장하고, 배열을 사용하여 반복 가능한 값 컬렉션을 저장할 수 있습니다. 또한 ES6에는 키-값 쌍 매핑 및 개별 값 설정 등 보다 세분화된 사용 사례에 적합한 특수한 데이터 구조도 도입되었습니다.
매핑
맵은 객체 리터럴과 마찬가지로 키-값 쌍으로 정보를 저장하는 반복 가능한 데이터 구조입니다. 객체 리터럴과 달리 맵은 값과 키 모두 모든 데이터 유형을 가질 수 있으며 맵에 추가되는 순서는 맵을 반복할 때 유지됩니다.
지도를 만들려면 Map()
생성자를 사용합니다.
const myMap = new Map();
myMap;
> Map(0)
두 요소로 구성된 배열과 유사한 객체가 포함된 배열 (또는 반복기 객체)과 유사한 구문을 사용하여 지도에 데이터를 미리 채울 수 있습니다. 두 요소로 구성된 각 데이터 구조의 첫 번째 요소가 키가 되고, 두 번째 요소가 키와 연결된 값이 됩니다. 가장 간단한 형식은 사실상 배열이며, 각 요소 자체가 두 요소(키와 맵에 추가할 요소의 값)로 구성된 배열입니다.
const myMap = new Map([
[ "myKey", "A string value" ],
[ "mySecondKey", 500 ],
[ "myThirdKey", true ]
]);
myMap;
> Map(3) {'myKey' => 'A string value', 'mySecondKey' => 500, 'myThirdKey' => true}
마찬가지로 Map 객체는 값 및 키가 모두 임의의 데이터 유형과 값을 사용할 수 있다는 점에서 객체 리터럴과 다릅니다.
const notAFunction = () => console.log( "function" );
const myMap = new Map([
[ null, 0 ],
[ false, "This is false" ],
[ undefined, "No defined value" ],
[ NaN, "Not a number" ]
]);
myMap;
> Map(4) {null => 0, false => 'This is false', undefined => 'No defined value', NaN => 'Not a number'}
지도 요소를 가져오거나 설정하거나 삭제하려면 Map
생성자에서 상속된 메서드를 사용합니다.
const myMap = new Map();
myMap;
> Map(0)
myMap.set( "myKey", "My value." );
myMap.has( "myKey" );
> true
myMap.get( "myKey" );
"My value."
myMap.delete( "myKey" );
myMap;
> Map(0)
맵의 키는 고유합니다. 즉, 동일한 키를 설정하면 이전에 저장된 키-값 쌍을 덮어씁니다.
const myMap = new Map([ [ "myKey", "A string value" ] ]);
myMap.set( "myKey", 500 );
myMap;
> Map(1) {'myKey' => 500}
객체와 마찬가지로 const
로 선언된 변수에 지도를 할당하고 이 지도를 수정할 수 있습니다. 그러나 const
의 다른 사용 사례와 마찬가지로 변수 자체를 변경하거나 삭제할 수는 없습니다.
const myMap = new Map();
myMap.set( "myKey", "A string value" );
myMap;
> Map(1) {'myKey' => 500}
WeakMap
WeakMap은 '약한' references가 있는 맵으로, 전역 기호 레지스트리에 추가되지 않은 객체 또는 기호에 대한 참조여야 합니다.
WeakMap을 만들려면 다음과 같이 WeakMap()
생성자를 사용합니다.
const myWeakMap = new WeakMap();
myWeakMap;
> WeakMap(0)
WeakMap 구문은 Map과 비슷하지만 WeakMaps는 반복 가능하지 않으며 객체나 기호 이외의 값을 키로 사용하려고 하면 구문 오류가 발생합니다. WeakMap 외부에 키에 대한 references가 없으면 WeakMap의 해당 객체 또는 기호와 관련 값 모두 가비지 컬렉션에 적합합니다.
따라서 객체 참조를 키로 사용하여 WeakMap에 객체와 연결된 메타데이터를 저장하는 등의 사용 사례가 허용됩니다. 이 객체에 대한 다른 참조가 없고 해당 객체가 메모리에서 삭제되면 관련 메타데이터도 삭제됩니다.
세트
세트는 고유한 값만 포함할 수 있지만 세트는 배열과 다소 비슷한 고유한 값의 반복 가능한 컬렉션입니다. 지도와 마찬가지로 Set을 반복하면 요소가 추가된 순서가 유지됩니다.
세트를 만들려면 Set()
생성자를 사용합니다.
const mySet = new Set();
mySet;
> Set []
배열 리터럴에서 Set을 만들 수도 있습니다.
const mySet = new Set([ 1, 2, 3 ]);
mySet;
> Set(3) [ 1, 2, 3 ]
세트는 중복 요소를 허용하지 않으므로 동일한 값의 여러 인스턴스를 포함하는 배열에서 세트가 생성되면 그 값의 첫 번째 인스턴스만 유지됩니다.
const mySet = new Set([ 1, 2, 3, 2 ]);
mySet;
> Set(3) [ 1, 2, 3 ]
Set에서 요소를 추가하거나 삭제하려면 Set
생성자에서 상속된 메서드를 사용합니다. 이러한 메서드는 색인을 참조하는 대신 요소 자체의 값에 따라 요소에 작업을 수행합니다.
const mySet = new Set();
mySet.add( "My value." );
mySet;
> Set [ "My value." ]
mySet.has( "My value." );
> true
mySet.delete( "My value." );
mySet;
> Set []
세트는 색인을 생성한 컬렉션이 아니며 이러한 방식으로 사용할 수도 없지만, 세트의 요소는 삽입 순서대로 반복됩니다. 세트에 중복 요소 값을 추가하려고 하면 원래 삽입 순서가 보존되어 건너뜁니다.
const mySet = new Set([ 1, 2, 3 ]);
mySet;
> Set(3) [ 1, 2, 3 ]
mySet.add( 2 );
> Set(3) [ 1, 2, 3 ]
세트에서 배열을 만들려면 Array.from()
메서드나 분산 문법을 사용하세요.
const mySet = new Set([ 1, 2, 3 ]);
const myArray = Array.from( mySet );
myArray;
> Array(3) [ 1, 2, 3 ]
[ ...mySet ];
> Array(3) [ 1, 2, 3 ]
WeakSet
WeakSet은 객체 참조 또는 전역 기호 레지스트리에 추가되지 않은 기호와 같이 가비지 수집 가능 값만 포함하는 집합입니다.
WeakSet을 만들려면 WeakSet()
생성자를 사용합니다.
const myWeakSet = new WeakSet();
myWeakSet;
> WeakSet []
WeakSet 구문은 Set과 비슷하지만 WeakSet은 반복 가능하지 않으며, 객체나 기호 이외의 값을 추가하려고 하면 구문 오류가 발생합니다. WeakMap과 마찬가지로 WeakSet에서 참조하는 값을 가리키는 다른 references가 없으면 이 값은 가비지 컬렉션에 사용할 수 있습니다.
이렇게 하면 반복 가능한 단일 관련 객체 컬렉션을 집계하는 등의 사용 사례가 가능합니다. WeakSet에서 참조하는 객체에 다른 참조가 없으면 연결된 요소도 WeakSet에서 삭제됩니다.
이해도 테스트
다음 사항이 주어졌을 때:
const myMap = new Map([ [ "myKey", "My string" ] ]); myMap.set( "myKey", 100 );
myMap
는 무엇을 반환하나요?
100
"My string"
undefined