JavaScriptを学ぶ[12.符号化の文法を簡略化する]


ES6


Shorthand Property Names

  const minbro1 = {
      name: 'Minbro',
      age: '25'
  }

  const name = 'Minbro'
  const age = '25'
  // 일일이 이렇게 쓸 필요 없이
  const minbro2 = {
      name: name,
      age: age
  }
  // 간단하게 이렇게 쓸 수 있다!
  const minbro3 = {
      name,
      age
  }

Destructuring Assignment


Object

  const student = {
    name: "James",
    level: 3,
  };

  // 일일이 이렇게 쓸 필요 없이
  {
    const name = student.name;
    const level = student.level;
    console.log(name, level);
  }

  {
    // 간단하게 이렇게 쓸 수 있다!
    const { name, level } = student;
    console.log(name, level);
    
    // 이름을 다르게 선언하려면 이런식으로!
    const { name: studentName, level: studentLevel } = student
    console.log(studentName, studentLevel)
  }

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 arrayCopy = [...array];

  // array copy & add
  const arrayCopy2 = [...array, { key: "key3" }];
ただし、Spread Syntaxを使用して、参照されるアドレス値ではなく、配列内の値自体をコピーします.だから.構文レプリケーションを使用して値を変更すると、すべてのレプリケーション配列の値が変更されます.
  // object copy
  const obj3 = {...obj1}
  
  // array concatenation
  const fruit1 = ['🍎', '🍌']
  const fruit2 = ['🍓', '🍒']
  const fruits = [...fruit1, fruit2]
  console.log(fruits)			// ["🍎", "🍌", "🍓", "🍒"]
  
  // object concatenation
  const cat1 = {cat1: '🐱'}
  const cat2 = {cat2: '🐈'}
  const cats = {...cat1, ...cat2}
  console.log(cats)			// {cat1: "🐱", cat2: "🐈"}
  // 단, key 이름이 같은 경우에는 제일 마지막의 object key의 값으로 덮어씌어진다!

Default Parameters

{
    function printMessage(message) {
        if (message == null) {
            message = 'default message'
        }
        console.log(message)
    }

    printMessage('hi')		// hi
    printMessage()		// default message
}

// Dafault parameter를 사용하여 parameter가 없을 경우 default를 설정할 수 있다!
// 한마디로 parameter가 undefined인 경우!
// null인 경우에는 parameter로 인식한다!
{
    function printMessage(message = 'default message') {
        console.log(message)
    }

    printMessage('hi')		// hi
    printMessage()		// default message
}

ES11


Optional Chaining

  const person1 = {
      name: 'minbro',
      job: {
          title: 'S/W Engineer',
          manager: {
              name: 'James'
          }
      }
  }
  const person2 = {
      name: 'Kate'
  }
  
  // 이렇게 함수를 만들면, person2에는 job이라는 object가 없어서 에러가 발생한다!
  function printManager(person) {
      console.log(person.job.manager.name)
  }
  printManager(person1)
  printManager(person2)
  // James
  // Uncaught TypeError: Cannot read property 'manager' of undefined
この問題は?演算子や&&を使って関数を作成することもできますが、Optional Chainを使うともっと楽になります!
  function printManager(person) {
      console.log(person.job?.manager?.name)
  }
  printManager(person1)
  printManager(person2)
  // James
  // undefined

Nullish Coalescing Operator

  // Logical OR operator
  // false: false, '', 0, null, undefined
  {
      const name = 'minbro'
      const userName = name || 'Guest'
      console.log(userName)		// minbro
  }
    
  {
      const name = null
      const userName = name || 'Guest'
      console.log(userName)		// Guest
  }
ただし「」と「0」はfalseとみなされるため、ユーザーがスペースや数字0を入力してもfalseと判断するエラーが発生します!
  {
      const name = ''
      const userName = name || 'Guest'
      console.log(userName)		// Guest
      
      const num = 0
      const message = message || 'undefined'
      console.log(message)		// undefined
  }
この問題を解決する方法はNullish Collecting Operatorです!
  {
      const name = ''
      const userName = name ?? 'Guest'
      console.log(userName)		// 
      // name이 있다면 name을 쓰고, name에 아무런 값이 없다면 'Guest'를 써라!
      
      const num = 0
      const message = message ?? 'undefined'
      console.log(message)		// 0
      // num이 있다면 num을 쓰고, num에 아무런 값이 없다면 'undefined'를 써라!
  }