πŸ”†ES6, ES11 Javascript (2)

πŸ”†Javascript ES11

이전에 μ „ν˜€ κ²ͺ어보지 λͺ»ν•œ μƒˆλ‘œμš΄ 문법이닀. 크게 2가지 이닀.

μ˜΅μ…”λ„ 체이닝은 정말 μ‹ λ°•ν•˜λ‹€ λΌλŠ” 것을 느꼈고 λ„λ¦¬μ‹œ μ½œλ¦¬μ‹±μ˜ κ²½μš°λŠ” κΈ°μ‘΄ OR μ—°μ‚°μž μ‚¬μš©μ‹œ falsy ν•œ κ°’ (빈 λ¬Έμžμ—΄, 0) 에 λŒ€ν•œ 처리λ₯Ό μ–΄λ–»κ²Œ 더 λͺ…ν™•ν•˜κ²Œ ν•΄ μ£Όμ–΄μ•Ό 할지 배울 수 μžˆμ—ˆλ‹€.

그럼 λ‹€μ‹œ μ‹œμž‘!

πŸ”†Optional Chaining

일단 μ˜ˆμ‹œ 객체λ₯Ό λ‘κ°œ λ„μ›Œ λ†“λŠ”λ‹€.

const person1 = {
  name: 'Mook',
  job: {
    title: 'S/W Engineer',
    manager: {
      name: 'Bob',
    },
  },
}

const person2 = {
  name: 'Bob',
}

person1 은 ν•΄λ‹Ή μ‚¬λžŒμ˜ 이름 그리고 job 에 λŒ€ν•œ λ‚΄μš©κ³Ό 또 κ·Έ μ•ˆμ— 상사 (manager) 에 λŒ€ν•œ 정보가 담겨 μžˆλ‹€. ν•˜μ§€λ§Œ person2 λŠ” person2 의 이름에 λŒ€ν•œ 정보 μ™Έμ—λŠ” μ–΄λ– ν•œ 정보도 μ—†λ‹€.

μ—¬κΈ°μ—μ„œ λ§Œμ•½ μ•„λž˜μ™€ 같은 ν•¨μˆ˜λ₯Ό κ΅¬ν˜„ν•˜κ³  ν•¨μˆ˜μ˜ μΈμžμ— person1 κ³Ό person2 λ₯Ό 각각 λ„£μ–΄ μ‹€ν–‰ν•˜λ©΄ μ–΄λ–»κ²Œ 될까?

function printManager(person) {
  console.log(person.job.manager.name)
}

printManager(person1)
printManager(person2)

person1 을 νŒŒλΌλ―Έν„°λ‘œ λ„£μ–΄ μ‹€ν–‰ν•œ ν•¨μˆ˜ printManager λŠ” β€˜Bob’ 을 좜λ ₯ν•  것이닀.

ν•˜μ§€λ§Œ person2 λ₯Ό λ„£μ–΄ μ‹€ν–‰ν•œ ν•¨μˆ˜ printManager λŠ” manager 에 λŒ€ν•œ 정보가 μ‘΄μž¬ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— Uncaught TypeError λ₯Ό μΌμœΌν‚¨λ‹€.

Uncaught TypeError: Cannot read property 'manager' of undefined
at printManager (<anonymous>:2:26)
at <anonymous>:1:1

μ΄λŸ¬ν•œ 경우λ₯Ό λ°©μ§€ν•˜κΈ° μœ„ν•΄ λ‹€μŒκ³Ό 같은 방법듀을 μ‚¬μš©ν•΄ λ³΄μ•˜λ‹€.

1. if λ¬Έ (Ternary Operator) 의 μ‚¬μš©

μ•„λž˜μ™€ 같은 μ½”λ“œλ‘œ μ€‘μ²©λœ Operator λ₯Ό μ“Έ μˆ˜λ„ μžˆλ‹€.

function printManager(person) {
  console.log(
    person.job
      ? person.job.manager
        ? person.job.manager.name
        : undefined
      : undefined
  )
}

ν•˜μ§€λ§Œ μ½”λ“œμ˜ 가독성 μΈ‘λ©΄μ—μ„œ κ·Έλ ‡κ²Œ 쒋은 방식은 μ•„λ‹Œ 것 κ°™λ‹€.

2, AND (&&) μ—°μ‚°μžμ˜ μ‚¬μš©

function printManager(person) {
  console.log(person.job && person.job.manager && person.job.manager.name)
}

person 의 job 이 μžˆλ‹€λ©΄ && μ—°μ‚°μžμ˜ λ‹€μŒμœΌλ‘œ λ„˜μ–΄κ°€μ„œ person 의 job 의 manager κ°€ μžˆλ‹€λ©΄, λ‹€μ‹œ λ‹€μŒ && μ—°μ‚°μžλ‘œ λ„˜μ–΄κ°€μ„œ person 의 job 의 manager 의 이름이 μžˆλŠ”μ§€ 보고 μ΅œμ’…μ μœΌλ‘œ λ§€λ‹ˆμ € 이름을 좜λ ₯ν•˜κ²Œ 될 터이닀.

ν•˜μ§€λ§Œ μ½”λ”©μ—μ„œ 쀑볡을 μ’‹μ•„ν•˜μ§€ μ•ŠλŠ” 만큼 계속 person.job 으둜 μ½”λ“œκ°€ μ€‘λ³΅λ˜μ–΄ κ°€λŠ” 것을 λ³Ό 수 μžˆλ‹€.

3. Optional Chaining

2와 같은 쀑볡을 ν”Όν•˜κ³ μž 이제 Optional Chaining 을 μ΄μš©ν•œλ‹€.

function printManager(person) {
  console.log(person.job?.manager?.name)
}

printManager(person1)
printManager(person2)

μ‹ κΈ°ν•˜λ‹€.

πŸ”†Nullish Coalescing Operator

κΈ°μ‘΄ OR μ—°μ‚°μžμ˜ μ‚¬μš©μ— λŒ€ν•΄μ„œ 잠깐 λ‹€λ€„λ³΄μžλ©΄ Node.js μ—μ„œ ν™˜κ²½λ³€μˆ˜ (process.env) λ₯Ό λ‹€λ£° λ•Œ, ν˜Ήμ€ μ‹œν€„λΌμ΄μ¦ˆλ₯Ό μ‚¬μš©ν•΄μ„œ λͺ¨λΈμ„ mysql κ³Ό μ—°κ²° ν–ˆμ„ λ•Œ μ•„λž˜μ™€ 같은 μ½”λ“œλ₯Ό λ³Έ 기얡이 μžˆμ„ 것이닀.

(λ˜‘κ°™μ€ μ½”λ“œλŠ” μ•„λ‹ˆκ³  λΉ„μŠ·ν•œ μ½”λ“œλ₯Ό 첨뢀..)

let server = {
  env: process.env.NODE_ENV,
  port: process.env.PORT || 4000,
  ip: process.env.IP || '0.0.0.0',
  ...
  };

이 λ•Œ OR μ—°μ‚°μžλ₯Ό μ‚¬μš©ν–ˆλ‹€.

λ¬Όλ‘  보닀 더 μ‰¬μš΄ μ˜ˆμ‹œλ₯Ό μž‘μ„±ν•΄ 보자.

const name = 'mook'
const userName = name || 'Guest'
console.log(userName)

μ΄λŸ¬ν•œ OR μ΄λ‚˜ AND μ—°μ‚°μžλ₯Ό μ‚¬μš©ν•  λ•ŒλŠ” β€˜κ±°μ§“:false’ 의 νŠΉμ„±μ„ 쑰금 이해할 ν•„μš”κ°€ μžˆλ‹€.

false λŠ” κ·Έ 자체둜 κ±°μ§“μ΄μ§€λ§Œ, ”(빈 λ¬Έμžμ—΄), 0(숫자), null, undefined 도 falsy ν•œ κ°’μœΌλ‘œ κ°„μ£Όλ˜μ–΄ 지기 λ•Œλ¬Έμ΄λ‹€.

const userName = name || 'Guest'

λ‹€μ‹œ, OR μ—°μ‚°μž μ•žμ— μžˆλŠ” name 이 false 일 λ•Œλ§Œ 뒀에 μžˆλŠ” β€˜Guest’ κ°€ μ‹€ν–‰λ˜λŠ” μ„±μ§ˆμ΄ μžˆλ‹€.

κ·Έλž˜μ„œ μ•„λž˜μ™€ 같이 name 에 null 이 ν• λ‹Ήλ˜κ±°λ‚˜ undefined κ°€ ν• λ‹Ήλœλ‹€λ©΄ userName 은 β€˜Guest’ κ°€ μ°νžŒλ‹€.

λ§žλ‹€.

const name = null
const userName = name || 'Guest'
console.log(userName)

그런데 name 에 빈 λ¬Έμžμ—΄μ΄λ‚˜ 0 이 ν• λ‹Ήλœλ‹€λ©΄ μ–΄λ–¨κΉŒ? κ·Έλž˜λ„ Guest κ°€ 찍힐 텐데 이것이 μ½”λ“œλ₯Ό μž‘μ„±ν•˜λŠ” μ˜λ„λŒ€λ‘œ λ§žλŠ” λ°©λ²•μΌκΉŒ?

1. name 이 빈 λ¬Έμžμ—΄, λ˜λŠ” 0 일 λ•Œ?

μ–΄λ–€ νŠΉμ •ν•œ 값이 null 이라면, 정해지지 μ•Šμ•˜λ‹€λ©΄ (undefined) 기본적인 값을 ν• λ‹Ήν•˜λ„λ‘ OR μ—°μ‚°μžλ₯Ό 많이 μΌλŠ”λ°

이처럼 name 이 null, undefined 인 경우 즉 μ•„λ¬΄λŸ° 것도 μ§€μ •λ˜μ§€ μ•Šμ€ κ²½μš°μ—λ§Œ β€œGuest” λ₯Ό 좜λ ₯ν•˜κ²Œ ν•˜κ³  싢은데

const name = ''
const userName = name || 'Guest'
console.log(userName)

μ΄λ ‡κ²Œ λ¬Έμžμ—΄μ΄ λΉ„μ–΄ μžˆλŠ” κ²½μš°μ—λ„ false 둜 κ°„μ£Όλ˜κΈ° λ•Œλ¬Έμ— 이 μ—­μ‹œ β€œGuest” κ°€ ν• λ‹Ήλ˜μ–΄ 버린닀.

즉, μ‚¬μš©μžμ˜ μ˜λ„λŠ” 아무 이름도 μ“°κ³  싢지 μ•Šμ€ 것인데 이 κ²½μš°μ—λ„ μ—­μ‹œ β€œGuest” κ°€ 할당이 λ˜λŠ” κ²ƒμ΄λ―€λ‘œ

λ°”λ‘œ 버그! 라 ν•  수 μžˆλ‹€!

λ³€μˆ˜μ— 0 이 ν• λ‹Ήλ˜λŠ” μ•„λž˜μ˜ κ²½μš°λ„ λ§ˆμ°¬κ°€μ§€ 이닀.

const num = 0
const message = num || 'undefined'
console.log(message)

이처럼 λ³€μˆ˜ num 이 숫자 0 으둜 μ§€μ •λ˜μ–΄ μžˆμŒμ—λ„ λΆˆκ΅¬ν•˜κ³  message 의 좜λ ₯은 undefined κ°€ λ‚˜μ˜€κ²Œ λ˜μ–΄ λ²„λ¦°λ‹€λŠ” 것이닀.

숫자 0 이 ν• λ‹Ήλ˜μ—ˆμ§€λ§Œ 0 은 false 둜 κ°„μ£Όλ˜μ–΄ 진닀 ν•΄μ„œ μ–΅μšΈ? ν•˜κ²Œ λ’€μ˜ 것인 undefined κ°€ ν• λ‹Ήλœ 것을 확인할 수 μžˆλ‹€.

OR μ—°μ‚°μžλŠ” μ΄λŸ¬ν•œ νŠΉμ„± λ•Œλ¬Έμ— 잘 μ΄ν•΄ν•˜κ³  μ‚¬μš©ν•΄μ•Ό ν•œλ‹€. μ•„λ‹ˆλ©΄ μ΄λŸ¬ν•œ μ˜ˆμ™Έ λ“€λ‘œ 인해 고생할 μˆ˜λ„ μžˆμ„ κ±° κ°™λ‹€.

2. OR μ—°μ‚°μžλ₯Ό κ°œμ„ ν•΄ μ’€ 더 λͺ…ν™•ν•œ μ½”λ“œ μž‘μ„±ν•˜κΈ°

이제 Nullish Coalescing λ₯Ό μ‚¬μš©ν•œλ‹€. OR μ—°μ‚°μž λŒ€μ‹  ?? μ—°μ‚°μžλ₯Ό μ‚¬μš©ν•˜λŠ” 것이닀.

const name = ''
const userName = name ?? 'Guest'
console.log(userName)

const num = 0
const message = num ?? 'undefined'
console.log(message)

es11


Written by@[DotoriMook]
ν”„λ‘ νŠΈμ—”λ“œ μ£Όλ‹ˆμ–΄ 개발자 λ„ν† λ¦¬λ¬΅μ˜ 기술개발 λΈ”λ‘œκ·Έ μž…λ‹ˆλ‹€.

GitHubMediumTwitterFacebook