Key 기반 컬렉션에 대하여
출처 : https://developer.mozilla.org/ko/docs/Web/JavaScript/Guide/Keyed_collections
Map 객체
Map과 Set은 '입력된 순서대로' 접근 가능한 요소들을 포함하고 있다.
Map객체에 저장되어 있는 각 요소들을 [키, 값] 형태의 배열로 반복적으로 반환해주는 for...of 를 사용할 수 있다.
var sayings = new Map();
sayings.set("dog", "woof");
sayings.set("cat", "meow");
sayings.set("elephant", "toot");
sayings.size; // 3
sayings.get("a"); // undefined
sayings.has("b"); // false
sayings.delete("dog");
for (var [key, value] of sayings) {
console.log(key + " goes " + value);
}
// "cat goes meow"
// "elephant goes toot"
Object와 Map 비교
Object | Map | |
key | Strings | any |
크기 | 수동추적 | .size() |
순서 | 삽입된 순서대로 | |
권장 용례 | 각 개별 요소에 대해 적용해야할 경우 | 키를 모르고 / 키와 값이 각각 동일한 Type일 경우 |
WeakMap
https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/WeakMap
WeakMap객체는 object만을 키로 허용하고 값은 임의의 값을 허용하는 키/값 형태의 요소의 집합이다. 키가 가지고 있는 객체에 대한 참조는 객체에 대한 참조가 더이상 존재하지 않을 경우 garbage collection(GC)의 수거 대상이 되는 약한 참조를 의미한다. 이로 인해 WeakMap은 키 목록을 제공해 주는 메서드가 없다. 만약에 키 목록을 제공한다면 garbage collection의 상태, 결과에 따라 키 목록이 변하게 될 것이다. 이는 비 결정성을 야기한다.
왜 쓰는가?
배열은 각 키와 각 값에 대한 참조가 무기한 유지되도록 보장하기 때문인데, 이 때문에 다른 곳에서 객체를 참조하지 않더라도 키가 가비지 컬렉션 대상이 되지 못한다. 값도 마찬가지이다.
Sets
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set
Set은 중복된 값을 허용하지 않는다.
var mySet = new Set();
mySet.add(1);
mySet.add(1); // 변화없음
mySet.add("some text");
mySet.add("foo");
mySet.has(1); // true
mySet.delete("foo");
mySet.size; // 2
for (let item of mySet) console.log(item);
// 1
// "some text"
배열과 Set의 상호 변환
Array.from 혹은 spread operator를 사용.
Array.from(mySet); // 근데 안되는데..머임
Set 생성자는 배열을 인자로 받을 수 있고 해당 배열을 Set객체의 요소로 저장한다. 주어진 배열내의 중복된 요소들은 제거된다.
mySet2 = new Set([1, 2, 3, 4]);
배열과 Set비교
- 배열은 느리다 : indexOf메서드를 사용하여 배열내에 특정 요소가 존재하는지 확인하는 것은 느리다.
- 배열은 삭제가 더디다 : 배열에선 해당 요소를 배열에서 잘라내야 하는 반면 Set객체는 요소의 값으로 해당 요소를 삭제하는 기능 제공한다.
- 배열이 못찾는 NaN : indexOf메서드로 NaN은 찾을 수 없다.
- Set객체는 값의 유일성을 보장하기 때문에 직접 요소의 중복성을 확인할 필요가 없다.
WeakSet 객체
WeakSet내의 중복된 객체는 없으며 WeakSet내의 요소를 열거할 수는 없다.
WeakSet과 Set비교
- WeakSet은 객체만 저장할 수 있다. 특정 type의 값을 저장할 수는 없다.
- 현재 저장되어 있는 객체에 대한 목록은 없으며 WeakSet은 열거형이 아니다.
- 메모리 누수에 대한 걱정이 없다.
'┝ 개발 언어 > ┝ html_css_js' 카테고리의 다른 글
크롬 익스텐션 개발 시 유의할 점 (0) | 2025.01.16 |
---|---|
test.html?name=:6 Uncaught TypeError: Cannot read properties of null (reading 'addEventListener') (0) | 2025.01.16 |
[js] 기본적인 배열 / 버퍼와 뷰 (1) | 2023.10.16 |
[js] 배열 원소 다루기 : delete & splice (0) | 2023.10.16 |
객체 분해(destructuring) 구문 (0) | 2023.10.05 |