function getResult(score) {
let result;
if (score > 5) {
result = '👍';
} else if (score <= 5) {
result = '👎';
}
return result;
}
condition ? exprIfTrue : exprIfFalse
// ✅ Good Code ✨
function getResult(score) {
return score > 5 ? '👍' : '👎';
}
function printMessage(text) {
let message = text;
if (text == null || text == undefined) {
message = 'Nothing to display 😜';
}
console.log(message);
}
좋은 코드
Nullish Coalescing Operator(널 병합 연산자) 를 이용하여 왼쪽연산자가 null 또는 undefined일 떄 오른쪽 피연산자를 반환
그렇지 않으면 왼쪽 피연산자를 반환하는 논리 연산자
??
를 사용하는 것이 좋음function printMessage(text) {
const message = text ?? 'Nothing to display 😜';
console.log(message);
}
function printMessage(text = 'Nothing to display 😜') {
console.log(text);
}
하고 싶은 것
안좋은 코드
const person = {
name: 'Julia',
age: 20,
phone: '0107777777',
};
// ❌ Bad Code 💩
function displayPerson(person) {
displayAvatar(person.name);
displayName(person.name);
displayProfile(person.name, person.age);
}
// ❌ Bad Code 💩
function displayPerson(person) {
const name = person.name;
const age = person.age;
displayAvatar(name);
displayName(name);
displayProfile(name, age);
}
function displayPerson(person) {
const { name, age } = person;
displayAvatar(name);
displayName(name);
displayProfile(name, age);
}
// Spread Syntax - Object
const item = { type: '👔', size: 'M' };
const detail = { price: 20, made: 'Korea', gender: 'M' };
// ❌ Bad Code 💩 - 수동적으로 하나씩 property 추가
const newObject = new Object();
newObject['type'] = item.type;
newObject['size'] = item.size;
newObject['price'] = detail.price;
newObject['made'] = detail.made;
newObject['gender'] = detail.gender;
console.log(newObject);
// ❌ Bad Code 💩 - 수동적으로 하나씩 property 추가2
const newObject2 = {
type: item.type,
size: item.size,
price: detail.price,
made: detail.made,
gender: detail.gender,
};
console.log(newObject);
Object.assign()
메소드는 열거할 수 있는 하나 이상의 출처 객체로부터 대상 객체로 속성을 복사할 때 사용합니다. 대상 객체를 반환...
(spread Syntax)를 이용하여 깔끔하게 해결 // ✅ Good Code ✨ - 방법1 object assign 이용
const shirt0 = Object.assign(item, detail);
console.log(shirt0);
// ✅ Better! Code ✨ - 방법2 spread Syntax 이용
const shirt = { ...item, ...detail};
console.log(shirt);
// Spread Syntax - Array
let fruits = ['🍉', '🍊', '🍌'];
// fruits.push('🍓');
fruits = [...fruits, '🍓'];
console.log(fruits);
// fruits.unshift('🍇');
fruits = ['🍇', ...fruits];
console.log(fruits);
const fruits2 = ['🍈', '🍑', '🍍'];
let combined = fruits.concat(fruits2);
combined = [...fruits, '🍒', ...fruits2];
console.log(combined);
// Remove Duplicates!
const array = ['🐶', '🐱', '🐈', '🐶', '🦮', '🐱'];
// 새로운 set을 만든 후 Spread Syntax를 이용해서 새로운 배열에 풀어냄
console.log([...new Set(array)]);
optional chaing이란
연산자 ?.
는 프로퍼티가 없는 중첩 객체를 에러 없이 안전하게 접근할 수 있습니다.
?.
은 ?.
'앞’의 평가 대상이 undefined
나 null
이면 평가를 멈추고 undefined
를 반환
단락평가
?.
는 왼쪽 평가대상에 값이 없으면 즉시 평가를 멈춥니다. 참고로 이런 평가 방법을 단락 평가(short-circuit)라고 부릅니다.
그렇기 때문에 함수 호출을 비롯한 ?.
오른쪽에 있는 부가 동작은 ?.
의 평가가 멈췄을 때 더는 일어나지 않습니다.
?.()와 ?.[]
?.
은 연산자가 아닙니다. ?.
은 함수나 대괄호와 함께 동작하는 특별한 문법 구조체(syntax construct)즉, 3가지 형태로 사용됨
obj?.prop
– obj
가 존재하면 obj.prop
을 반환하고, 그렇지 않으면 undefined
를 반환함obj?.[prop]
– obj
가 존재하면 obj[prop]
을 반환하고, 그렇지 않으면 undefined
를 반환함obj?.method()
– obj
가 존재하면 obj.method()
를 호출하고, 그렇지 않으면 undefined
를 반환함let user1 = {
admin() {
alert("관리자 계정입니다.");
}
}
let user2 = {};
user1.admin?.(); // 관리자 계정입니다. 출력
user2.admin?.();
//--------------------------------------------------
let user1 = {
firstName: "Violet"
};
let user2 = null; // user2는 권한이 없는 사용자라고 가정해봅시다.
let key = "firstName";
alert( user1?.[key] ); // Violet
alert( user2?.[key] ); // undefined
alert( user1?.[key]?.something?.not?.existing); // undefined
하고싶은 것
나쁜 코드 예시
// Optional Chaining
const bob = {
name: 'Julia',
age: 20,
};
const anna = {
name: 'Julia',
age: 20,
job: {
title: 'Software Engineer',
},
};
// ❌ Bad Code 💩
function displayJobTitle(person) {
if (person.job && person.job.title) {
console.log(person.job.title);
}
}
// ✅ Good Code ✨ - Optional Chaining 활용
function displayJobTitle(person) {
if (person.job?.title) {
console.log(person.job.title);
}
}
// ✅ Good Code ✨ - 추가적으로 Nullish Coalescing operator 사용하여 더 깔끔하게
function displayJobTitle(person) {
const title = person.job?.title ?? 'No Job Yet 🔥';
console.log(title);
}
{}
` )하고싶은 것
안좋은 코드
const person = {
name: 'Julia',
score: 4,
};
// ❌ Bad Code 💩
console.log(
'Hello ' + person.name + ', Your current score is: ' + person.score
);
// ✅ Good Code ✨ - Template Literals 적용
console.log(`Hello ${person.name}, Your current score is: ${person.score}`);
// ✅ Good Code ✨ - Object Destructuring 추가 적용
const { name, score } = person;
console.log(`Hello ${name}, Your current score is: ${score}`);
// ✅ Good Code ✨ - 함수화를 통한 확장성, 유지보수성 추가
function greetings(person) {
const { name, score } = person;
console.log(`Hello ${name}, Your current score is: ${score}`);
}
// Looping
const items = [1, 2, 3, 4, 5, 6];
// ❌ Bad Code 💩
function getAllEvens(items) {
const result = [];
for (let i = 0; i < items.length; i++) {
if (items[i] % 2 === 0) {
result.push(items[i]);
}
}
return result;
}
function multiplyByFour(items) {
const result = [];
for (let i = 0; i < items.length; i++) {
result.push(items[i] * 4);
}
return result;
}
function sumArray(items) {
let sum = 0;
for (let i = 0; i < items.length; i++) {
sum += items[i];
}
return sum;
}
const evens = getAllEvens(items);
const multiple = multiplyByFour(evens);
const sum = sumArray(multiple);
console.log(sum);
const result = items
.filter((num) => num % 2 === 0)
.map((num) => num * 4)
.reduce((a, b) => a + b, 0);
console.log(result);
// ❌ Bad Code 💩
function displayUser() {
fetchUser() //
.then((user) => {
fetchProfile(user) //
.then((profile) => {
updateUI(user, profile);
});
});
}
// ✅ Good Code ✨
async function displayUser() {
const user = await fetchUser();
const profile = await fetchProfile(user);
updateUI(user, profile);
}
자바스크립트 헷갈리는게 많아 고생했었는데... 와우!!, 잘 정리해주셨군요!