πŸ“’ νƒ€μž… λ³€ν™˜κ³Ό 단좕 평가

zooyahoΒ·2022λ…„ 7μ›” 13일
0
post-thumbnail

μ°Έκ³ ) λͺ¨λ˜ μžλ°”μŠ€ν¬λ¦½νŠΈ Deep Dive

암묡적 νƒ€μž…λ³€ν™˜

μžλ°”μŠ€ν¬λ¦½νŠΈμ—”μ§„μ€ 가급적 μ—λŸ¬λ₯Ό λ°œμƒμ‹œν‚€μ§€ μ•Šλ„λ‘ 암묡적 νƒ€μž… λ³€ν™˜μ„ 톡해 ν‘œν˜„μ‹μ„ ν‰κ°€ν•©λ‹ˆλ‹€.

● λ¬Έμžμ—΄ νƒ€μž…μœΌλ‘œ λ³€ν™˜

  • +μ—°μ‚°μžλŠ” ν”Όμ—°μ‚°μž 쀑 ν•˜λ‚˜ 이상이 λ¬Έμžμ—΄μ΄λ©΄ λ¬Έμžμ—΄ μ—°κ²° μ—°μ‚°μžλ‘œ λ™μž‘ν•œλ‹€.
  0 + '' // '0'
  -1 + '' // '-1'
  NaN + '' // 'NaN'
  false + '' // 'false'
  null + '' // 'null'
  ({}) + '' // '[object object]'
  [] + '' // ''
  [10,20] + '' // '10,20'

● 숫자 νƒ€μž…μœΌλ‘œ λ³€ν™˜

  • λ‹¨ν•­μ—°μ‚°μž(+,-)λŠ” ν”Όμ—°μ‚°μžκ°€ 숫자 νƒ€μž…μ˜ 값이 μ•„λ‹ˆλ©΄ μˆ«μžνƒ€μž…μ˜ κ°’μœΌλ‘œ 암묡적 νƒ€μž… λ³€ν™˜μ„ μˆ˜ν–‰ν•˜λŠ”λ°, 빈 λ¬Έμžμ—΄(''), 빈 λ°°μ—΄([]), null, falseλŠ” 0,-0으둜, trueλŠ” 1,-1둜 λ³€ν™˜λœλ‹€. 객체와 빈 배열이 μ•„λ‹Œ λ°°μ—΄, undefinedλŠ” λ³€ν™˜λ˜μ§€ μ•Šμ•„ NaN이 λœλ‹€.
+[] + // 0
  {} + // NaN
  null - // NaN
  false - // -0
  ""[10]; // -0 // NaN
undefined; // NaN

● λΆˆλ¦¬μ–Έ νƒ€μž…μœΌλ‘œ λ³€ν™˜

μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진은 λΆˆλ¦¬μ–Έ νƒ€μž…μ΄ μ•„λ‹Œ 값을 Truthy κ°’ λ˜λŠ” Falthy κ°’μœΌλ‘œ κ΅¬λΆ„ν•œλ‹€.

Falthy

  • false
  • undefined
  • null
  • 0, -0
  • NaN
  • ''(λΉˆλ¬Έμžμ—΄)

Truthy

  • Falthy κ°’ μ™Έμ˜ λͺ¨λ“  κ°’

λͺ…μ‹œμ  νƒ€μž… λ³€ν™˜

ν‘œμ€€ 빌트인 μƒμ„±μž ν•¨μˆ˜λ₯Ό newμ—°μ‚°μž 없이 ν˜ΈμΆœν•˜λŠ” 방법과 빌트인 λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜λŠ” 방법, 암묡적 νƒ€μž…λ³€ν™˜μ„ μ΄μš©ν•œλ‹€.

● λ¬Έμžμ—΄ νƒ€μž…μœΌλ‘œ λ³€ν™˜

  • String μƒμ„±μž ν•¨μˆ˜λ₯Ό newμ—°μ‚°μž 없이 ν˜ΈμΆœν•˜λŠ” 방법 String(NaN); // 'NaN'
  • Object.prototype.toString λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜λŠ” 방법 (true).toString(); 'true'
  • λ¬Έμžμ—΄ μ—°κ²° μ—°μ‚°μžλ₯Ό μ΄μš©ν•˜λŠ” 방법 [] + '' // ''

● 숫자 νƒ€μž…μœΌλ‘œ λ³€ν™˜

  • Number μƒμ„±μž ν•¨μˆ˜λ₯Ό new μ—°μ‚°μž 없이 ν˜ΈμΆœν•˜λŠ” 방법 Number(true) // 1
  • parseInt, parseFloat ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜λŠ” 방법(λ¬Έμžμ—΄λ§Œ 숫자 νƒ€μž…μœΌλ‘œ λ³€ν™˜ κ°€λŠ₯) parseInt('1.6') // 1
  • +단항 μ‚°μˆ  μ—°μ‚°μžλ₯Ό μ΄μš©ν•˜λŠ” 방법 +[] // NaN
  • *μ‚°μˆ  μ—°μ‚°μžλ₯Ό μ΄μš©ν•˜λŠ” 방법 false * 1 // 0

● λΆˆλ¦¬μ–Έ νƒ€μž…μœΌλ‘œ λ³€ν™˜

  • Boolean μƒμ„±μž ν•¨μˆ˜ newμ—°μ‚°μž 없이 ν˜ΈμΆœν•˜λŠ” 방법 Boolean(Infinity) // true
  • ! λΆ€μ • 논리 μ—°μ‚¬μžλ₯Ό λ‘λ²ˆ μ‚¬μš©ν•˜λŠ” 방법 !!{} // true

단좕 평가

ν‘œν˜„μ‹μ„ ν‰κ°€ν•˜λŠ” 도쀑에 평가 κ²°κ³Όκ°€ ν™•μ •λœ 경우 λ‚˜λ¨Έμ§€ 평가 과정을 μƒλž΅ν•˜λŠ” 것을 λ§ν•œλ‹€.

● 논리 μ—°μ‚°μžλ₯Ό μ‚¬μš©ν•œ 단좕 평가

  • 논리합(||) λ˜λŠ” 논리곱(&&) μ—°μ‚°μž ν‘œν˜„μ‹μ˜ 평가 κ²°κ³ΌλŠ” λΆˆλ¦¬μ–Έ 값이 아닐 μˆ˜λ„ μžˆλ‹€.
  • 논리합(||) λ˜λŠ” 논리곱(&&) μ—°μ‚°μž ν‘œν˜„μ‹μ€ μ–Έμ œλ‚˜ 2개의 ν”Όμ—°μ‚°μž 쀑 μ–΄λŠ ν•œμͺ½μœΌλ‘œ ν‰κ°€λœλ‹€.
  • 단좕 평가λ₯Ό μ‚¬μš©ν•˜λ©΄ if문을 λŒ€μ²΄ν•  수 μžˆλ‹€.
let done = true;
let msg = done && "μ™„λ£Œ";
console.log(msg); // 'μ™„λ£Œ'
true || anything; // true
false || anything; // anything
true && anything; // anything
false && anything; // false

πŸ’‘ 논리곱(&&)은 첫번째 Falthy값을 λ°˜ν™˜, λͺ¨λ‘ Truthy일 경우 λ§ˆμ§€λ§‰ ν”Όμ—°μ‚°μžλ₯Ό λ°˜ν™˜!!
πŸ’‘ 논리합(||)은 첫번째 Truthy값을 λ°˜ν™˜, λͺ¨λ‘ Falthy일 경우 λ§ˆμ§€λ§‰ ν”Όμ—°μ‚°μžλ₯Ό λ°˜ν™˜!!

"cat" || true; //'cat'
true || "cat"; // true
true && "cat"; // 'cat'
false && "cat"; // false
false && null; // false

ν•¨μˆ˜ λ§€κ°œλ³€μˆ˜μ— 기본값을 μ„€μ •ν•  λ•Œ

ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•  λ•Œ 인수λ₯Ό μ „λ‹¬ν•˜μ§€ μ•ŠμœΌλ©΄ λ§€κ°œλ³€μˆ˜μ—λŠ” undefinedκ°€ ν• λ‹Ήλœλ‹€. μ΄λ•Œ 단좕평가λ₯Ό μ‚¬μš©ν•΄ λ§€κ°œλ³€μˆ˜μ˜ 기본값을 μ„€μ •ν•˜λ©΄ undefined둜 인해 λ°œμƒν•  수 μžˆλŠ” μ—λŸ¬λ₯Ό 방지할 수 μžˆλ‹€.

function getStringLength(str) {
  str = str || "";
  return str.length;
}
getStringLength(); // 0
getStringLength("hi"); // 2

// λ§€κ°œλ³€μˆ˜μ— κΈ°λ³Έκ°’ μ„€μ •
function getStringLength(str = "") {
  return str.length;
}

● μ˜΅μ…”λ„ 체이닝 μ—°μ‚°μž(?.)

  • μ’Œν•­μ˜ ν”Όμ—°μ‚°μžκ°€ null λ˜λŠ” undefined인 경우 undefinedλ₯Ό λ°˜ν™˜ν•˜κ³ , 그렇지 μ•ŠμœΌλ©΄ μš°ν•­μ˜ ν”„λ‘œνΌν‹° μ°Έμ‘°λ₯Ό 이어간닀.
  • 객체λ₯Ό 가리킀기λ₯Ό κΈ°λŒ€ν•˜λŠ” λ³€μˆ˜κ°€ nullλ˜λŠ” undefinedκ°€ μ•„λ‹Œμ§€ ν™•μΈν•˜κ³  ν”„λ‘œνΌν‹°λ₯Ό μ°Έμ‘°ν•  λ•Œ μœ μš©ν•¨.
let str = "";
let length = str?.length;
console.log(length); // 0

length = str && str.length;
console.log(length); // ''

● null병합 μ—°μ‚°μž(??)

  • μ’Œν•­μ˜ ν”Όμ—°μ‚°μžκ°€ null λ˜λŠ” undefined인 경우 μš°ν•­μ˜ ν”Όμ—°μ‚°μžλ₯Ό λ°˜ν™˜ν•˜κ³ , 그렇지 μ•ŠμœΌλ©΄ μ’Œν•­μ˜ ν”Όμ—°μ‚°μžλ₯Ό λ°˜ν™˜ν•œλ‹€.
  • λ³€μˆ˜μ— 기본값을 μ„€μ •ν•  λ•Œ μœ μš©ν•˜λ‹€.
let foo = null ?? "default string";
console.log(foo); // 'default string'

// ''κ°€ μœ νš¨ν•œ 값일 경우 ||λ³΄λ‹€λŠ” ??μ‚¬μš©μ΄ 적합함.
foo = "" ?? "default string";
console.log(foo); // ''

foo = "" || "default string";
console.log(foo); // 'default string'
profile
즐겁게 κ°œλ°œν•˜μž μ₯¬μ•Όν˜ΈπŸ‘»

0개의 λŒ“κΈ€