[마스터 개념] 5 | map, 유용한 연산자들
1 variable 변수
2 operator 연산자
3 function 함수
4 object 객체
5 class 클래스
7 built-in 빌트인 객체
8 array 배열
9 iterator 이터러블
10> map
11> more-operators 유용한 연산자들
12 module 모듈
13 promise 프로미스
14 scope 스코프
15 prototype 프로토타입
16 closure 클로져
17 this
10 map
Set
중복 X, 집합체이다.
// 생성
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)); // 1 // 2 // 3
for (const value of set.values()) {
console.log(value); // 1 // 2 // 3
}
// 추가
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: 6 };
const objs = new Set([obj1, obj2]);
console.log(objs); // Set(2) { { name: '사과', price: 8 }, { name: '바나나', price: 6 } }
Object set 은 얕은 복사가 이뤄진다.
Map
순서상관 X, key 중복 X, value 중복 O, object와 유사하다.
// 생성
const map = new Map([
["key1", "사과"],
["key2", "바나나"],
]);
console.log(map); // Map(2) { 'key1' => '사과', 'key2' => '바나나' }
// 사이즈 확인
console.log(map.size); // 2
// 존재하는지 확인 - key 로 확인
console.log(map.has("key1")); // true
console.log(map.has("key6")); // false
// 순회
map.forEach((value, key) => console.log(key, value)); // key1 사과 // key2 바나나
console.log(map.keys()); // [Map Iterator] { 'key1', 'key2' }
console.log(map.values()); // [Map Iterator] { '사과', '바나나' }
console.log(map.entries()); // [Map Entries] { [ 'key1', '사과' ], [ 'key2', '바나나' ] }
// 찾기 - key 로 확인
console.log(map.get("key1")); // 사과
console.log(map.get("key4")); // undefined
// 추가 - key 로 확인
map.set("key3", "키위");
console.log(map); // Map(3) { 'key1' => '사과', 'key2' => '바나나', 'key3' => '키위' }
// 삭제 - key 로 확인
map.delete("key3");
console.log(map); // Map(2) { 'key1' => '사과', 'key2' => '바나나' }
// 전부 삭제
map.clear();
console.log(map); // Map(0) {}
Object 와 Map 은 매우 유사하지만, 사용 가능한 함수가 다르다.
Symbol
문자열이 똑같아도 서로 다른 유일한 키를 생성할 수 있다.
const map2 = new Map();
const key3 = Symbol("key");
const key4 = Symbol("key");
map2.set(key3, "hello");
console.log(map2.get(key4)); // false
console.log(key3 === key4); // undefined
const k1 = Symbol.for("key");
const k2 = Symbol.for("key");
console.log(k1 === k2); // true
// 전역 심볼 레지스트리에서 Symbol이 가진 문자열에 대한 정보 가져옴
console.log(Symbol.keyFor(k1)); // key
Symbol.for( ) : 문자열에 대해 동일한 심볼로 사용하고 싶을 때 사용
Symbol.for( ) 로 추가하면 전역 심볼 레지스트리 (Global Symbol Registry) 에 추가되는데, 전역 심볼 레지스트리에 보관된 것만 keyFor( ) 를 통해 값을 가져올 수 있다.
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
obj 의 Symbol 과 console.log 로 출력하는 obj 의 Symbol 은 심볼이기 때문에 다른 것이다. 따라서 undefined 가 출력된다.
11 more-operators 유용한 연산자들
Logical Operator 논리 연산자
조건문 밖에서는 단축평가 (short-circuit evaluation) 가 이뤄진다.
const obj1 = { name: "강아지" };
const obj2 = { name: "고양이", owner: "mallang" };
let result = obj1 && obj2;
console.log(result); // { name: '고양이', owner: 'mallang' }
result = obj1 || obj2;
console.log(result); // { name: '강아지' }
&& : 첫 조건이 true이면 -> 뒤의 값이 할당
|| : 첫 조건이 true 이면 -> 해당 값이 할당, 첫 조건이 false 이면 -> 뒤의 값이 할당
function changeOwner(animal) {
if (!animal.owner) {
throw new Error("주인이 없음");
}
animal.owner = "바뀐주인!";
}
function makeNewOwner(animal) {
if (animal.owner) {
throw new Error("주인이 있음");
}
animal.owner = "새로운주인!";
}
obj1.owner && changeOwner(obj1);
obj2.owner && changeOwner(obj2);
console.log(obj1); // { name: '강아지' }
console.log(obj2); // { name: '고양이', owner: '바뀐주인!' }
obj1.owner || makeNewOwner(obj1);
obj2.owner || makeNewOwner(obj2);
console.log(obj1); // { name: '강아지', owner: '새로운주인!' }
console.log(obj2); // { name: '고양이', owner: '바뀐주인!' }
obj1.owner 는 값이 없으므로 false 값이다. && 연산자이므로 changeOwner(obj1) 는 실행되지 않는다.
obj2.owner 는 값이 있으므로 true 값이다. && 연산자이므로 changeOwner(obj2) 가 실행되어 obj2.owner 의 값이 바뀐다.
obj1.owner 는 값이 없으므로 false 값이다. || 연산자이므로 makeNewOwner(obj1) 이 실행되어 obj2.owner 에 값이 생긴다.
obj2.owner 는 값이 있으므로 true 값이다. || 연산자이므로 makeNewOwner(obj2) 는 실행되지 않는다.
조건이 truty일 때 && 무언가 해야 할 경우
조건이 falshy일 때 || 무언가 해야 할 경우
// null 또는 undefined 인 경우를 확인 할 때
let item = { price: 1 };
const price = item && item.price;
console.log(price); // 1
item 의 값이 없다면, item.price 에 접근하게 되면 error 가 발생한다. 따라서 item 값이 있을 때만, item.price 에 접근할 수 있도록 구현할 수 있다.
function print(message) {
const text = message || "Hello";
console.log(text);
}
print(); // Hello
print(undefined); // Hello
print(null); // Hello
print(0); // Hello
function print(message = 'Hi') {
console.log(message);
}
print(); // Hi
print(undefined); // Hi
print(null); // null
print(0); // 0
단축평가를 사용하여 기본값을 설정할 수 있다.
|| : 값이 falshy 한 경우 설정 -> 0, -0, null, undefined, ' '
default parameter : 값을 전달하지 않거나, undefined 만 설정
Optional Chaining Operator 옵셔널 체이닝 연산자
null 또는 undefined 인 경우를 확인할 때 ?. 를 사용한다.
?. : 값이 있으면 접근하고, 값이 없으면 접근 X
let obj = { name: "강아지", owner: { name: "mallang" } };
function printName(obj) {
const ownerName = obj?.owner?.name;
console.log(ownerName); // mallang
}
printName(obj);
obj 가 있으면, 그 안에 owner 가 있으면, 그 안에 name 이 있으면 그 name 을 할당한다.
obj && obj.owner && obj.owner.name 보다 obj?.owner?.name 이 훨씬 간단하다.
Nullish Coalescing Operator
0, -0, ' ' 일 때는 true 로 처리하고 null, undefined 일 때만 false 로 처리하고 싶을 때 ?? 를 사용한다.
let num = 0;
console.log(num || "-1"); // -1
console.log(num ?? "-1"); // 0
|| : 0, -0, ' ' 일 때 false 로 처리
?? : null, undefined 일 때 false 로 처리
'💠프로그래밍 언어 > JavaScript' 카테고리의 다른 글
[마스터 개념] 7 | 프로미스 (0) | 2022.11.11 |
---|---|
[마스터 개념] 6 | 모듈 (0) | 2022.11.07 |
[마스터 개념] 4 | 이터러블 (0) | 2022.11.01 |
[마스터 개념] 3 | 배열 (0) | 2022.10.31 |
[마스터 개념] 2 | 객체, 클래스, 빌트인 객체 (0) | 2022.10.26 |