let john = { name: "John" };
let array = [ john ];
john = null
console.log(array[0]) // { name: 'John' }
```javascript
let john = { name: "John" };
let weakMap = new WeakMap();
weakMap.set(john, "...");
john = null // john 사라짐
사용 예시?
부차적인 데이터를 저장할 곳이 필요할 때
객체가 도달가능하지 않은 상태가 되면 자동으로 메모리에서 삭제가 됨
-> visitsCountMap을 수동으로 청소해 줄 필요가 없음
let visitsCountMap = new Map(); // 맵에 사용자의 방문 횟수를 저장함
// weakmap 사용 -> let visitsCountMap = new WeakMap();
// 사용자가 방문하면 방문 횟수를 늘려줍니다.
function countUser(user) {
let count = visitsCountMap.get(user) || 0;
visitsCountMap.set(user, count + 1);
}
// 📁 main.js
let john = { name: "John" };
countUser(john); // John의 방문 횟수를 증가시킵니다.
// John의 방문 횟수를 셀 필요가 없어지면 아래와 같이 john을 null로 덮어씁니다.
john = null;
2. 캐싱
- 캐싱 : 시간이 오래 걸리는 작업의 결과를 저장해 연산 시간과 비용을 절약해 줌
- 동일한 함수를 여러 번 호출해야 할 때, 최초 호출된 값을 어딘가 저장해놨다가 다음 호출 시 저장된 값을 사용하는 것
값을 쓰다가, 필요없어지면 최초 값을 삭제해주면 나머지 캐싱된 데이터도 알아서 메모리에서 삭제 됨
### Set
중복을 허용하지 않는 값을 모아놓은 Collection
`Array.find()`를 사용해도 되지만, 배열 내의 요소 전체를 뒤져서 중복 값을 찾기 때문에 성능 면에서 떨어짐
- foreach를 사용해 값을 순회할 수 있음
- 하지만 index에 직접 접근은 불가능
-
```javascript
let set = new Set();
let john = { name: "John" };
let pete = { name: "Pete" };
let mary = { name: "Mary" };
set.add(john);
set.add(pete);
set.add(mary);
set.add(john);
set.add(mary);
set.size // 3
for (let user of set) {
console.log(user.name); // John, Pete, Mary
}
Weak Set
객체가 메모리에서 삭제되면, 저장된 연관 자료들 역시 메모리에서 자동으로 삭제가 됨
객체만 저장 가능함
도달 가능한 객체일 때에만 메모리에서 유지됨
let visitedSet = new WeakSet();
let john = { name: "John" };
let pete = { name: "Pete" };
let mary = { name: "Mary" };
visitedSet.add(john); // John이 사이트를 방문합니다.
visitedSet.add(pete); // 이어서 Pete가 사이트를 방문합니다.
visitedSet.add(john); // 이어서 John이 다시 사이트를 방문합니다.
// visitedSet엔 두 명의 사용자가 저장될 겁니다.
// John의 방문 여부를 확인해보겠습니다.
alert(visitedSet.has(john)); // true
// Mary의 방문 여부를 확인해보겠습니다.
alert(visitedSet.has(mary)); // false
john = null;
// visitedSet에서 john을 나타내는 객체가 자동으로 삭제됩니다.
# Generator 란?
- 화살표 함수에서는 사용하지 못함
- 사용: function 뒤에 `*` 붙이기
```javascript
function * generator () {}
return도 쓸 수 있지만, return을 만나면 generator가 끝남
generator 안에 새로운 generate를 사용할 수 있음
function * anotherGenerator(i) {
yield i + 1;
yield i + 2;
yield i + 3;
}
function * generator(i) {
yield* anotherGenerator(i);
}
var gen = generator(1);
gen.next().value; // 2
gen.next().value; // 3
gen.next().value; // 4
Collection이란?
프로그래밍 언어가 제공하는 값을 담을 수 있는 컨테이너
JS Collection
Map
keys()
,values()
,entries()
사용 가능)Object를 Map으로 바꾸기
Object.entries
=> 객체의 [key, 값] 쌍을 요소로 가지는 배열을 반환Map을 Object로 바꾸기
Object.fromEntries
=> 각 요소가 [key, 값] 쌍인 배열을 객체로 바꿔줌Weak Map
객체가 메모리에서 삭제되면, 저장된 연관 자료들 역시 메모리에서 자동으로 삭제가 됨
keys()
,values()
,entries()
사용 불가능console.log(array[0]) // { name: 'John' }
사용 예시?
// 사용자가 방문하면 방문 횟수를 늘려줍니다. function countUser(user) { let count = visitsCountMap.get(user) || 0; visitsCountMap.set(user, count + 1); }
// 📁 main.js let john = { name: "John" };
countUser(john); // John의 방문 횟수를 증가시킵니다.
// John의 방문 횟수를 셀 필요가 없어지면 아래와 같이 john을 null로 덮어씁니다. john = null;
Weak Set
객체가 메모리에서 삭제되면, 저장된 연관 자료들 역시 메모리에서 자동으로 삭제가 됨
let john = { name: "John" }; let pete = { name: "Pete" }; let mary = { name: "Mary" };
visitedSet.add(john); // John이 사이트를 방문합니다. visitedSet.add(pete); // 이어서 Pete가 사이트를 방문합니다. visitedSet.add(john); // 이어서 John이 다시 사이트를 방문합니다.
// visitedSet엔 두 명의 사용자가 저장될 겁니다.
// John의 방문 여부를 확인해보겠습니다. alert(visitedSet.has(john)); // true
// Mary의 방문 여부를 확인해보겠습니다. alert(visitedSet.has(mary)); // false
john = null; // visitedSet에서 john을 나타내는 객체가 자동으로 삭제됩니다.
generator 안에 새로운 generate를 사용할 수 있음
사용: