toggle-toggle / javascript-basic

🌱우아한 테크코스 프론트엔드 자바스크립트 기초 스터디 입니다.
9 stars 0 forks source link

[2021.04.01] 컬렉션과 생성기 #13

Closed ddongule closed 3 years ago

ddongule commented 3 years ago

Collection이란?

프로그래밍 언어가 제공하는 값을 담을 수 있는 컨테이너

JS Collection

let map = new Map();
map.set('1', 'string 1');
map.set(1, 'number 1');
map.set(true, 'boolean');

const a = { a: 3 }
map.set(a, 'boolean');

Object를 Map으로 바꾸기

Object.entries => 객체의 [key, 값] 쌍을 요소로 가지는 배열을 반환

// 각 요소가 [키, 값] 쌍인 배열
let map = new Map([
  ['1',  'str1'],
  [1,    'num1'],
  [true, 'bool1']
]);
map.get('1')     // str1
// ---
let obj = {
  name: "그루밍",
  age: 2
};

let map = new Map(Object.entries(obj));
alert( map.get('name') ); // 그루밍

Map을 Object로 바꾸기

Object.fromEntries => 각 요소가 [key, 값] 쌍인 배열을 객체로 바꿔줌

let prices = Object.fromEntries([
  ['banana', 1],
  ['orange', 2],
  ['meat', 4]
]);

// now prices = { banana: 1, orange: 2, meat: 4 }
alert(prices.orange); // 2

Weak Map

객체가 메모리에서 삭제되면, 저장된 연관 자료들 역시 메모리에서 자동으로 삭제가 됨

console.log(array[0]) // { name: 'John' }

```javascript
let john = { name: "John" };

let weakMap = new WeakMap();
weakMap.set(john, "...");

john = null // john 사라짐

사용 예시?

  1. 부차적인 데이터를 저장할 곳이 필요할 때 객체가 도달가능하지 않은 상태가 되면 자동으로 메모리에서 삭제가 됨 -> 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 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 () {}