// Shorthand property names
{
const ellie1 = {
name: 'Ellie',
age: '18'
};
const name = 'Ellie';
const age = '18';
const ellie2 = {
name: name,
age: age
}; // key 와 value 가 같으면 하나로 작성 가능하다.
const ellie3 = {
name,
age
};
console.log(ellie1, ellie2, ellie3); // 모두 같은 값 {name: "Ellie", age: "18"}
}
//Destructuring Assignment
{
//object
const student = {
name: 'Anna',
level: 1
};
{
const name = student.name;
const level = student.level;
console.log(name, level);
}
{
const { name, level } = student; // key 와 value 가 맞게 할당된다.
console.log(name, level); // Anna 1
//이름을 바꾸고 싶어! 다음과 같이 하자
const { name: changeName, level: changeLevel } = student;
console.log(changeName, changeLevel); //Anna 1
}
//array
const animals = ['😀', '😁'];
//
{
const first = animals[0];
const second = animals[1];
console.log(first, second); // 😀 😁
}
{
const [first, second] = animals;
console.log(first, second); // 😀 😁
}
}
//Spread Syntax
{
const obj1 = { key: 'key1'};
const obj2 = { key: 'key2'};
const array = [obj1, obj2];
//array copy
const copy = [...array]; //array 에 있는 item 하나하나 씩을 낱개로 가져와서 복사해 준다.
console.log(array, copy); // 동일한 결과 값
const copy2 = [...array, {key: 'key3'}];
console.log(array, copy, copy2); // copy2 는 key3 가 추가되었다.
//여기서 잠깐! copy2 와 copy 는 별개인가?
// 실제로 obj1 이라는 변수는 object 자체를 가리키지 않는다. object 의 주소를 가지고 있다.
// 그렇기 때문에 복사 해 올 때도 주소를 복사 해 온다. 그럼 당연히 같은 곳을 가리킬 것이다.
obj1.key = 'changeKey1';
console.log(array, copy, copy2); // 모두 changeKey1 으로 바꿔버린다.
// object copy
const obj3 = {...obj1};
console.log(obj3);
// array concatenation
const fruits1 = ['😀', '😁'];
const fruits2 = ['😂', '🤣'];
const concat = [...fruits1, ...fruits2];
console.log(concat); // 4개 다 뜬다.
//object merge
// const face1 = { face1: '😎'};
// const face2 = { face2: '😍'};
// const face3 = {...face1, ...face2};
//console.log(face3); // 둘이 합쳐졌다. 만약! key 가 동일한 obj 를 합치게 되면 뒤에 오는애가 앞에 key를 덮어 버린다.
const face1 = { face: '😎'};
const face2 = { face: '😍'};
const face3 = {...face1, ...face2};
console.log(face3); // 😍 만 출력
}
//Defalut parameters
{
{
function printMessage(message) {
console.log(message);
}
printMessage('hello');
printMessage(); // undefined
//이제 정상적이지 않은 arg가 넘어와도 잘 넘어갈 수 있게 defalut 해 주자.
function printMessage2(message = 'default message') {
console.log(message);
}
printMessage2('hello');
printMessage2(); //default message 출력
}
}
//Ternary operator
{
const isCat = true;
{
let component = isCat ? '😺' : '💩';
//console.log(component);
console.log(isCat ? '😺' : '💩');
}
}
//Template Literals
{
const mountain = '🏔';
const temparature = '16';
console.log(
`Let's go ${mountain}! Today temparature is ${temparature}`
);
}
//Optional Chaining (ES11)
{
const person1 = {
name: 'Ellie',
job: {
title: 'S/W Engineer',
manager: {
name: 'Bob',
},
},
};
const person2 = {
name: 'Bob'
}
function printManager(person) {
console.log(person.job?.manager?.name); // 코드가 엄청 짧아진다.
}
printManager(person1);
printManager(person2); // undefined
}
//Nullish Coalscing Operator (ES11)
{
//기존
{
const name = 'malza';
const userName = name || 'Guest'; // name 이 있으면 name인 malza, 없으면 guest 가 될 것이다.
console.log(userName); // malza
}
//그런데 다음을 보자
{
const name = 0;
const userName = name || 'GUEST'; // 0 이 false 로 간주된다. 그래서?!
console.log(userName); // GUEST 가 나온다.
}
{
const name = '';
const userName = name || 'GUEST'; // '' 이 false 로 간주된다. 그래서?!
console.log(userName); // GUEST 가 나온다.
}
{ // 그래서 나온 방식이 '??' !!
const name = '';
const userName = name ?? 'Guest';
console.log(userName); // 아무것도 안나온다.
const num = 0;
const message = num ?? 'undefined'
console.log(message); // 0 출력
}
}