22.Using JS as an expert (자바스크립트 프로처럼 쓰기)

Updated:

1.Ternary Operator (삼항연산자)

// Ternary Operator

// ❌ Bad Code 💩
function getResult(score) {
  let result;
  if (score > 5) {
    result = "👍";
  } else if (score <= 5) {
    result = "👎";
  }
  return result;
}

// ✅ Good Code ✨
// 삼항 연산자를 이용해서 바로 return 해서 ? : 을 사용해서 조건문 만들기
function getResult(score) {
  return score > 5 ? "👍" : "👎";
}

console.log(getResult(6));
console.log(getResult(5));

2.Nullish Coalescing Operator

// Nullish coalescing operator

// ❌ Bad Code 💩
// 전달받은 parameter 가 있다면 바로 text 에 할당하고 null 이나 undefined 일때 message 출력
function printMessage(text) {
  let message = text;
  if (text == null || text == undefined) {
    message = "Nothing to display 😜";
  }
  console.log(message);
}

// ✅ Good Code ✨
// text 에 내용이 있다면 그대로 쓰고 없다고 하면이 ?? 임 Nothing to display 출력
function printMessage(text) {
  const message = text ?? "Nothing to display 😜";
  console.log(message);
}

🔷Default Parameter 와의 차이점

// 🚨 Default parameter is only for undefined
// Default parameter 의 값은 오직 undefined 만 되는것에 주의 text 에 값이 할당 되지 않을경우에 입력된 값을 출력하는것 (즉 parameter 에 어떠한 값이 있다고 하면 해당되지 않는경우임)
function printMessage(text = "Nothing to display 😜") {
  console.log(text);
}

🔷Logical Operator 와의 차이점

Nullish coalescing operator ?? 의 경우는 left 쪽이 null, undefined 일 경우에 right 쪽을 나타내는 것임

  • letExpr ?? rightExpr

비슷한 경우로 Logical OR operator || 의 경우에는 left 쪽이 falsy 일경우에 right 쪽을 나타내는 경우임 (* 참고 falsy 의 값은 false, undefined, null, 0, -0. “”, ‘’, `` 와 같은 빈 문자열도 해당됨)

  • leftExpr || rightExpr
// 🚨 Logical OR operator ||
function printMessage(text) {
  const message = text || "Nothing to display 😜";
  console.log(message);
}

const result = getInitialState() ?? fetchFromServer();
console.log(result);

function getInitialState() {
  return null;
}
function fetchFromServer() {
  return "Hiya from 💻";
}

printMessage("Hello");
printMessage(null);
printMessage(undefined);
printMessage(0);
printMessage("");

🔷Expr 의미

  • Nullish coalescing operator 는 value 값이 아닌 Expr 의 값으로도 사용이 가능함 (코드를 실행해서 실행된 값을 할당할 때도 많이 쓰이고 있음)
const result = getInitialState() ?? fetchFromSever();
console.log(result);

function getInitialState() {
  return null;
}

function fetchFromSever() {
  return "Hiya from 💻";
}

3.Object Destructuring

// Object Destructuring

const person = {
  name: "Julia",
  age: 20,
  phone: "0107777777",
};

// ❌ Bad Code 💩
// person. 을 반복적으로 사용해서 보기 좋지 않은 코드임
function displayPerson(person) {
  displayAvatar(person.name);
  displayName(person.name);
  displayProfile(person.name, person.age);
}

// ❌ Bad Code 💩
// name, age 지역변수를 만들어서 사용한 코드 그러나, person. 의 반복 과 코드가 늘어남
function displayPerson(person) {
  const name = person.name;
  const age = person.age;
  displayAvatar(name);
  displayName(name);
  displayProfile(name, age);
}

// ✅ Good Code ✨
// Object Destructuring 구조분해 할당 person 의 각각 해당되는 name 과 age 가 각각 구조 분해 되서 할당 되 다시 변수로 사용이 가능한 코드가 됨 (더 가독성 및 코드의 단순화가 됨)
function displayPerson(person) {
  const { name, age } = person;
  displayAvatar(name);
  displayName(name);
  displayProfile(name, age);
}

https://youtu.be/BUAhpB3FmS4?t=562 볼차례 임

4.Spread Syntax

Object 에서 사용하기

// Spread Syntax - Object
const item = { type: "👔", size: "M" };
const detail = { price: 20, made: "Korea", gender: "M" };

// ❌ Bad Code 💩
// key 와 value 등을 수동적으로 update 할 수 있긴 하지만, 기존의 object 를 변경하는것은 좋지 않음
item["price"] = detail.price;

// ❌ Bad Code 💩
// 새로운 생성자 object 를 만들어서 하나씩 하드코딩 하는것은 좋지 않음
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 💩
// 만약 1000개 이상의 key 와 type 이 있을경우에 이렇게 수동코딩하게 되면 좋지 않음
const newObject2 = {
  type: item.type,
  size: item.size,
  price: detail.price,
  made: detail.made,
  gender: detail.gender,
};
console.log(newObject);

// ✅ Good Code ✨
// Object assign 함수를 이용해서 함께 묶고 싶은 변수를 전달하면 shirt0 에 전달 되는 방식임
const shirt0 = Object.assign(item, detail);
console.log(shirt0);

// ✅ Better! Code ✨
// spread syntax 를 사용해서 새로운 object 에다가 모두 가져온다음에 detail 에 price 값을 30으로 덮어 씌울때 편함
const shirt = { ...item, ...detail, price: 30 };
console.log(shirt);

Array 에서 사용하기

// Spread Syntax - Array
let fruits = ["🍉", "🍊", "🍌"];

// fruits.push('🍓');
// 딸기가 제일 마지막에 push 되는것. ...fruits 를 하나씩 다 꺼내와서 다시 배열에 담는것임
fruits = [...fruits, "🍓"];
console.log(fruits);

// fruits.unshift('🍇');
// array에 앞에 추가하고 싶은 unshift 와 같이 하려면 앞에다 추가해주면 됨
fruits = ["🍇", ...fruits];
console.log(fruits);

const fruits2 = ["🍈", "🍑", "🍍"];

// 2개의 배열을 합치고 싶을때 concat() 을 통해 합쳐도 되고
let combined = fruits.concat(fruits2);

// spread Syntax 를 사용해서 합쳐도 되는데 아래와 같이 중간에 체리를 넣고 싶으면 중간에 위치 시켜서 넣으면 됨
combined = [...fruits, "🍒", ...fruits2];
console.log(combined);

5.Optional Chaining

// Optional Chaining
const bob = {
  name: "Julia",
  age: 20,
};
const anna = {
  name: "Julia",
  age: 20,
  job: {
    title: "Software Engineer",
  },
};

// ❌ Bad Code 💩
// person 에 잡이 있고 title 이 있으면 그 person 의 job 을 출력하는 코드
// && 의 연산자를 이용하면 코드가 길어지고 가독성이 떨어짐
function displayJobTitle(person) {
  if (person.job && person.job.title) {
    console.log(person.job.title);
  }
}

// ✅ Good Code ✨
// optional Chaining 을 사용해서 person.job? 이 있다면 title 안의 값을 검색하고 job 이 비어 있다면 이것이 바로 false 가 되기 때문에 if 문은 실행되지 않음
function displayJobTitle(person) {
  if (person.job?.title) {
    console.log(person.job.title);
  }
}

// ✅ Good Code ✨
// Nullish coalescing 과 같이 사용하게 되면 false 일 경우의 msg 도 출력 할 수 있는 간단한 코드로 만들 수 있음
function displayJobTitle(person) {
  const title = person.job?.title ?? "No Job Yet 🔥";
  console.log(title);
}

displayJobTitle(bob);
displayJobTitle(anna);

6.Template Literals

// Template Literals (Template String)
const person = {
  name: "Julia",
  score: 4,
};

// ❌ Bad Code 💩
// + 연산자를 이용해서 계속 붙여 나가는 코드는 코드가 길어지고 보기가 좋지 않게 됨
console.log(
  "Hello " + person.name + ", Your current score is: " + person.score
);

// ✅ Good Code ✨
// backtick 키를 사용해서  template literals 를 사용하게 되면 더 직관적인 code 가 됨
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}`);
}

7.Loops

// 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);

// ✅ Good Code ✨
// 함수를 사용하지 않고 arr API 를 사용해서 filter, map, reduce 를 사용해서 각각의 수식을 처리 할 수 있음

// filter 는 조건의 값을 가져와서 새로운 값을 return 함
const evens = items.filter((num) => num % 2 === 0);

// map 은 기존 arr 에 하나씩 탐색하고 모든 조건에 맞게 한다음에 모두 return 하게 됨
const multiple = evens.map((num) => num * 4);

// reduce 는 하나의 값을 return 하게 되는 데 누적 합계, 곱하기 이든 a 를 고정 시키고 b 를 대입하는 방식임 (마지막에 0 쓰는거 잊지 말기)
const sum = multiple.reduce((a, b) => a + b, 0);
console.log(sum);

// ✅ Good Code ✨
// 만약 연속적인 일을 처리한다면 chaining 을 통해서 일을 처리 할 수 있게 됨
const result = items
  .filter((num) => num % 2 === 0) // 짝수 인것들만 filtering 한 다음에
  .map((num) => num * 4) // 그값들을 4로 곱해서  mapping 해준 다음에
  .reduce((a, b) => a + b, 0); // 그 값들의 총 합을 구하면 됩니다
console.log(result);

8.Async-Await

// Promise -> Async/await

// ❌ Bad Code 💩
// Promise 를 계속 중첩해서 사용하는 경우에는 then then then 을 계속사용해서 코드가 복잡해 질 수 있음
function displayUser() {
  fetchUser() //
    .then((user) => {
      fetchProfile(user) //
        .then((profile) => {
          updateUI(user, profile);
        });
    });
}

// ✅ Good Code ✨
// 순차적으로 진행하기 때문에 더 가독성이 좋게 async 와 await 을 사용해서 2가지 연속되는 Promise 를 사용하는 경우라면 async 와 await 을 이용해서 변경하면 좋은 코드가 완성 됨
async function displayUser() {
  const user = await fetchUser();
  const profile = await fetchProfile(user);
  updateUI(user, profile);
}

9.Set

  • arr 는 중복을 허용하는 자료 구조 인데 new Set 을 통해서 중복된 값을 제거 할 수 있음
// Remove Duplicates!

const array = ["🐶", "🐱", "🐈", "🐶", "🦮", "🐱"];

// 새로운 배열로 spread syntax 를 사용해서 Set() 에서 중복이 허용된것을 지워서 사용하는 방법
console.log([...new Set(array)]);

🔶 🔷 📌 🔑

Reference

Leave a comment