13. Map, Set, Symbol

연우·2023년 1월 17일
0

드림코딩

목록 보기
10/15
post-thumbnail

세트 Set

  • 데이터의 집합체
  • array와 다르게 인덱스가 없고 중복이 불가능
  • 이미 있는 값을 추가해도 아무일도 일어나지 않음
// Set
const set = new Set([1, 2, 3]);
console.log(set); // Set(3) {1, 2, 3}

// 사이즈 확인
console.log(set.size); // 3

// 존재하는지 확인
console.log(set.has(2));; // true 
console.log(set.has(6)); // false

// 순회
set.forEach((item) => console.log(item));
for (const value of set.values()){
	console.log(value);
}
// 추가
set.add(6)
console.log(set); // Set(4) {1, 2, 3, 6}
set.add(6);
// 있는데 추가하면 무시됨, 중복이 불가능
console.log(set); // Set(4) {1, 2, 3, 6}

// 삭제
set.delete(6)
console.log(set); // Set(3) {1, 2, 3}

//전부 삭제
set.clear();
console.log(set); // Set(0) {}

//오브젝스 세트
const obj1 = { name: '🍎', price: 8 };
const obj2 = { name: '🍌', price: 5 };
const objs = new Set([obj1, obj2]);
console.log(objs);
//forSet(2) { { name: '🍎', price: 8 }, { name: '🍌', price: 5 } }

//퀴즈
obj1.price= 10;
objs.add(obj1)
console.log(objs); // Set(2) { { name: '🍎', price: 10 }, { name: '🍌', price: 5 } }

// 퀴즈
const obj3 =  {name: '🍌', price:5}
//오브젝트는 메모리의 힙에 만들어지고 메모리 참조주소가 담긴다
// 그러므로 중복이아닌 서로다른 메모리이므로 추가됨
objs.add(obj3);
console.log(objs);
obj3.price = 8;
console.log(objs);

맵 Map

  • 키와 값으로 이루어진 자료구조, 객체와 유사함
  • [key, value]
  • key 중복 불가능 : 하나의 key에 하나의 value만
const map = new Map([
	['key1', '🍎'],
	['key2', '🍌'],
]);
console.log(map); // Map(2) {'key1 => 🍎', 'key2' => '🍌' }

// 사이즈 확인
console.log(map.size); // 2

// 존재하는지 확인
console.log(map.has('key1')); // true
console.log(map.has('key6')); // false

// 순회
map.forEach((value, key)=> console.log(key, value));
// key1 🍎
// key1 🍌
console.log(map.keys());
console.log(map.values());
console.log(map.entries());

// 찾기
console.log(map.get('key1')); // 🍎
console.log(map.get('key4')); // undefined

// 추가
map.set('key3','🥝') 

console.log(map); // Map(3) {'key1 => 🍎', 'key2' => '🍌', 'key3' => '🥝' }
// 삭제
map.delete('key3')
console.log(map); // Map(2) {'key1 => 🍎', 'key2' => '🍌' }

// 전부삭제
map.clear();
console.log(map); // Map(0) {}

오브젝트와의 큰 차이점

  • 구조상으로는 확인할 수 없지만 사용할 수 있는 함수에 차이점이 있다.
  • 객체에서는 동적으로 접근 가능하나 맵은 불가능
const key = {name : 'milk', price:10};
const milk = {name : 'milk', price:10, description:'맛있는우유'};
const obj = {
	[key]: milk,
}
console.log(obj);
const map2 = new Map([[key, milk]]);
console.log(map2);
console.log(obj[key]);
console.log(map2[key]); // undefined
console.log(map2.get(key));

심볼 Symbol

  • 유일한 키를 생성할 수 있음
onst map =new Map();
// const key1 = 'key';
// const key2 = 'key';
const key1 = Symbol('key');
const key2 = Symbol('key');
map.set(key1, 'hello')
console.log(map.get(key2));// undefined
console.log(key1===key2);// false
// 키 이름이 똑같아도 각각 다른 키임
  • 동일한 이름으로 하나의 키를 사용하고 싶다면, Symbol.for
  • 전역 심벌 레지스트리 (Global Symbol Registry)
const k1 = Symbol.for('key');
const k2 = Symbol.for('key');
console.log(k1===k2); //true
console.log(Symbol.keyFor(k1)); //key
console.log(Symbol.keyFor(key1)); //undefined

const obj = {[k1]:'hello',[Symbol('key')]:1};
console.log(obj);  // { [Symbol(key)]: 'Hello', [Symbol(key)]: 1 }
console.log(obj[k1]); //hello
console.log(obj[Symbol('key')]); //undefined

0개의 댓글