(πŸ“– λͺ¨λ˜ μžλ°”μŠ€ν¬λ¦½νŠΈ λ”₯λ‹€μ΄λΈŒ) 9μž₯. νƒ€μž… λ³€ν™”κ³Ό 단좕 평가

λ…Έμ˜μ™„Β·2023λ…„ 9μ›” 27일
0

JavaScript(Deep Dive)

λͺ©λ‘ 보기
4/23
post-thumbnail

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

1. νƒ€μž…λ³€ν™˜μ΄λž€?

κ°’μ˜ νƒ€μž…μ€ 개발자의 μ˜λ„μ— 따라 λ‹€λ₯Έ νƒ€μž…μœΌλ‘œ λ³€ν™˜ν•  수 있고, μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진에 μ˜ν•΄ μ•”λ¬΅μ μœΌλ‘œ νƒ€μž…μ΄ μžλ™ λ³€ν™˜λ˜κΈ°λ„ ν•œλ‹€.
λͺ…μ‹œμ  νƒ€μž… λ³€ν™˜ : κ°œλ°œμžκ°€ μ˜λ„μ μœΌλ‘œ κ°’μ˜ νƒ€μž…μ„ λ³€ν™˜ν•˜λŠ” 것
암묡적 νƒ€μž… λ³€ν™˜ : μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진에 μ˜ν•΄ μ•”λ¬΅μ μœΌλ‘œ νƒ€μž…μ„ λ³€ν™˜ν•˜λŠ” 것

// λͺ…μ‹œμ  νƒ€μž… λ³€ν™˜ μ˜ˆμ‹œ
var x =10;
var str = x.toString();
console.log(typeof str, str) // string 10
// 암묡적 νƒ€μž… λ³€ν™˜ μ˜ˆμ‹œ
var x =10;
var str = x + '';
console.log(typeof str, str) // string 10

πŸ’‘ νƒ€μž… λ³€ν™˜μ„ 이해해야 ν•˜λŠ” 이유

πŸ’‘ μžμ‹ μ΄ μž‘μ„±ν•œ μ½”λ“œμ—μ„œ 암묡적 νƒ€μž… λ³€ν™˜μ΄ λ°œμƒν•˜λŠ” 지, λ°œμƒν•œλ‹€λ©΄ μ–΄λ–€ νƒ€μž…μ΄ μ–΄λ–€ κ°’μœΌλ‘œ λ³€ν™˜λ˜λŠ” 지, 그리고 νƒ€μž… λ³€ν™˜λœ κ°’μœΌλ‘œ ν‘œν˜„μ‹μ΄ μ–΄λ–»κ²Œ 평가될 것인지 예츑 κ°€λŠ₯ν•΄μ•Ό ν•œλ‹€.

λ§Œμ•½ νƒ€μž… κ²°κ³Όλ₯Ό μ˜ˆμΈ‘ν•˜μ§€ λͺ»ν•˜κ±°λ‚˜ 예츑 결과와 μΌμΉ˜ν•˜μ§€ μ•ŠλŠ”λ‹€λ©΄ 였λ₯˜λ₯Ό 생산할 κ°€λŠ₯성이 높아진닀.

❓ λͺ…μ‹œμ  νƒ€μž… λ³€ν™˜λ§Œ μ‚¬μš©ν•˜κ³  암묡적 νƒ€μž… λ³€ν™˜μ€ λ°œμƒν•˜μ§€ μ•Šλ„λ‘ ν•˜λ©΄ 쒋지 μ•Šμ„κΉŒ?

❓ 쒋은생각이긴 ν•˜λ‚˜ μ˜³μ§€ μ•Šλ‹€. λ•Œλ‘œλŠ” λͺ…μ‹œμ  νƒ€μž… λ³€ν™˜λ³΄λ‹€ 암적 νƒ€μž… λ³€ν™˜μ΄ 가독성 츑면에 더 μ’‹κΈ° λ•Œλ¬Έμ΄λ‹€.

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

μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진은 ν‘œν˜„μ‹μ„ 평가할 λ•Œ 개발자의 μ˜λ„μ™€λŠ” 상관없이 μ½”λ“œμ˜ λ¬Έλ§₯을 κ³ λ €ν•΄ μ•”λ¬΅μ μœΌλ‘œ 데이터 νƒ€μž…μ„ κ°•μ œλ³€ν™˜(암묡적 νƒ€μž… λ³€ν™˜) ν•  λ•Œκ°€ μžˆλ‹€.

μ•”λ¬΅μ μœΌλ‘œ 데이터 νƒ€μž…μ„ κ°•μ œλ³€ν™˜ ν•˜λ©΄ 즉, 암묡적 νƒ€μž…μ΄ λ°œμƒν•˜λ©΄ λ¬Έμžμ—΄, 숫자, λΆˆλ¦¬μ–Έκ³Ό 같은 μ›μ‹œ νƒ€μž… 쀑 ν•˜λ‚˜λ‘œ νƒ€μž…μ„ μžλ™ λ³€ν™˜.

2-1. λ¬Έμžμ—΄ νƒ€μž…μœΌλ‘œ λ³€ν™˜

1 + '2' // '12'
// '12'둜 λ¬Έμžμ—΄λ‘œ 암묡적 νƒ€μž… λ³€ν™˜

+ μ—°μ‚°μžλŠ” ν”Όμ—°μ‚°μž 쀑 ν•˜λ‚˜ 이상이 λ¬Έμžμ—΄ μΌλ•Œ, λ¬Έμžμ—΄ μ—°κ²° μ—°μ‚°μžλ‘œ λ™μž‘ λ”°λΌμ„œ μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진은 ν”Όμ—°μ‚°μž 쀑 λ¬Έμžμ—΄ νƒ€μž…μ΄ μ•„λ‹Œ ν”Όμ—°μ‚°μžλ₯Ό λ¬Έμžμ—΄ νƒ€μž…μœΌλ‘œ 암묡적 νƒ€μž… λ³€ν™˜

ν”Όμ—°μ‚°μžλž€?
λ‹€μ‹œ ν”Όμ—°μ‚°μžμ˜ μš©μ–΄ λœ»μ„ λ¦¬λ§ˆμΈλ“œ ν•˜μžλ©΄ μ—°μ‚°μ˜ λŒ€μƒμ„ ν”Όμ—°μ‚°μžλΌκ³  ν•œλ‹€. 그리고 ν”Όμ—°μ‚°μžλŠ” κ°’μœΌλ‘œ 평가될 수 μžˆλŠ” ν‘œν˜„μ‹μ΄μ–΄μ•Ό ν•œλ‹€.

2-2. 숫자 νƒ€μž…μœΌλ‘œ λ³€ν™˜**

1 - "1" // 0
1 * '10' // 10
1 / 'one' // NaN
+'0' // 0
+'string' // NaN
+'undefined' // NaN

μ‚°μˆ  μ—°μ‚°μž(-, *, /)의 역할은 숫자 값을 λ§Œλ“œλŠ” κ²ƒμœΌλ‘œ μ‚°μˆ  μ—°μ‚°μžμ˜ λͺ¨λ“  ν”Όμ—°μ‚°μžλŠ” λͺ¨λ‘ 숫자 νƒ€μž…μ΄μ–΄ ν•œλ‹€. λ”°λΌμ„œ μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진은 μ‚°μˆ  μ—°μ‚°μž ν‘œν˜„μ‹μ„ ν‰κ°€ν•˜κΈ° μœ„ν•΄ ν”Όμ—°μ‚°μž 쀑에 숫자 νƒ€μž…μ΄ μ•„λ‹Œ ν”Όμ—°μ‚°μžλ₯Ό 숫자 νƒ€μž…μœΌλ‘œ 암묡적 νƒ€μž… λ³€ν™˜.

ν”Όμ—°μ‚°μžλ₯Ό 숫자 νƒ€μž…μœΌλ‘œ λ³€ν™˜ν•  수 μ—†λŠ” κ²½μš°λŠ” μ‚°μˆ  연산을 μˆ˜ν–‰ν•  수 μ—†μœΌλ―€λ‘œ ν‘œν˜„μ‹μ˜ 평가 κ²°κ³ΌλŠ” NaN이닀.

+ 단항 μ—°μ‚°μžλ₯Ό μ‚¬μš©ν•˜μ—¬ ν”Όμ—°μ‚°μžκ°€ 숫자 νƒ€μž…μ˜ 값이 μ•„λ‹ˆλ©΄ 숫자 νƒ€μž…μ˜ κ°’μœΌλ‘œ 암묡적 νƒ€μž… λ³€ν™˜μ„ μˆ˜ν–‰ν•  수 μžˆλ‹€.

μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ 숫자 νƒ€μž…μ΄ μ•„λ‹Œ 값을 숫자 νƒ€μž…μœΌλ‘œ 암묡적 νƒ€μž… λ³€ν™˜μ„ μˆ˜ν–‰ν•  λ•Œ

빈 λ¬Έμžμ—΄ '', λ¬Έμžμ—΄ 0 빈 λ°°μ—΄ [], null, falseλŠ” 0으둜, trueλŠ” 1둜 λ³€ν™˜λœλ‹€. 객체와 λΉˆλ°°μ—΄μ΄ μ•„λ‹Œ λ°°μ—΄, undefinedλŠ” λ³€ν™˜λ˜μ§€ μ•Šμ•„ NaN이 λœλ‹€.

2-3. λΆˆλ¦¬μ–Έ νƒ€μž…μœΌλ‘œ λ³€ν™˜

if λ¬Έμ΄λ‚˜ forλ¬Έκ³Ό 같은 μ œμ–΄λ¬Έ λ˜λŠ” μ‚Όν•­ 쑰건 μ—°μ‚¬μžμ˜ 쑰건식은 λΆˆλ¦¬μ–Έ κ°’, 즉 논리적 μ°Έ/κ±°μ§“μœΌλ‘œ ν‰κ°€λ˜μ–΄μ•Ό ν•˜λŠ” ν‘œν˜„μ‹μΈλ° μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진은 μ‘°κ±΄μ‹μ˜ 평가 κ²°κ³Όλ₯Ό λΆˆλ¦¬μ–Έ νƒ€μž…μœΌλ‘œ 암묡적 νƒ€μž… λ³€ν™˜ ν•œλ‹€.

if('') console.log(1);
if(true) console.log(2);
if(0) console.log(3);
if('str') console.log(4);
if(null) console.log(5);

// 2,4

μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진은 λΆˆλ¦¬μ–Έ νƒ€μž…μ΄ μ•„λ‹Œ 값을 Truthy κ°’(참으둜 ν‰κ°€λ˜λŠ” κ°’) λ˜λŠ” Falsyκ°’(κ±°μ§“μœΌλ‘œ ν‰κ°€λ„λŠ” κ°’)으둜 ꡬ뢄 즉, μ œμ–΄λ¬Έμ˜ 쑰건식과 같이 λΆˆλ¦¬μ–Έ κ°’μœΌλ‘œ ν‰κ°€λ˜μ–΄μ•Ό ν•  λ¬Έλ§₯μ—μ„œ Truthy값은 true둜, Falsy값은 false둜 암묡적 νƒ€μž… λ³€ν™˜

πŸ’‘ false둜 ν‰κ°€λ˜λŠ” Falsy κ°’

πŸ’‘ false ,undefined ,null, 0, -0,NaN, 빈 λ¬Έμžμ—΄ ''
Falsy κ°’ μ™Έμ˜ λͺ¨λ“  값은 λͺ¨λ‘ true둜 ν‰κ°€λ˜λŠ” Truthy κ°’.

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

개발자의 μ˜λ„μ— 따라 λͺ…μ‹œμ μœΌλ‘œ νƒ€μž…μ„ λ³€κ²½ν•  수 있으며 νƒ€μž…μ„ λ³€κ²½ν•˜λŠ” 방법은 λ‹€μ–‘ν•˜λ‹€
1. ν‘œμ€€ 빌트인 μƒμƒμž ν•¨μˆ˜ (String, Number, Boolean)λ₯Ό new μ—°μ‚°μž 없이 ν˜ΈμΆœν•˜λŠ” 방법
2. 빌트인 λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜λŠ” 방법
3. 암묡적 νƒ€μž… λ³€ν™˜μ„ μ΄μš©ν•˜λŠ” 방법

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

  1. String μƒμ„±μž ν•¨μˆ˜λ₯Ό new μ—°μ‚°μž 없이 ν˜ΈμΆœν•˜λŠ” 방법
  2. Object.prototype.toString λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜λŠ” 방법
  3. λ¬Έμžμ—΄ μ—°κ²° μ—°μ‚°μžλ₯Ό μ΄μš©ν•˜λŠ” 방법 πŸ‘‰ 암묡적 νƒ€μž… λ³€ν™˜

1. String μƒμ„±μž ν•¨μˆ˜λ₯Ό new μ—°μ‚°μž 없이 ν˜ΈμΆœν•˜λŠ” 방법

String(1) // "1"
String(NaN) // "NaN"

2. Object.prototype.toString λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜λŠ” 방법

// Object.prototype.toString μ‚¬μš©
(1).toString() // "1"
(NaN).toString() // "NaN"

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

  1. Number μƒμ„±μž ν•¨μˆ˜λ₯Ό new μ—°μ‚°μž 없이 ν˜ΈμΆœν•˜λŠ” 방법
  2. parseInt, parseFloat ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜λŠ” 방법(λ¬Έμžμ—΄λ§Œ 숫자 νƒ€μž…μœΌλ‘œ λ³€ν™˜ κ°€λŠ₯)
  3. "+" 단항 μ‚°μˆ  μ—°μ‚°μžλ₯Ό μ΄μš©ν•˜λŠ” 방법 πŸ‘‰ 암묡적 νƒ€μž… λ³€ν™˜
  4. "*" μ‚°μˆ  μ—°μ‚°μžλ₯Ό μ΄μš©ν•˜λŠ” 방법 πŸ‘‰ 암묡적 νƒ€μž… λ³€ν™˜

1. Number μƒμ„±μž ν•¨μˆ˜λ₯Ό new μ—°μ‚°μž 없이 ν˜ΈμΆœν•˜λŠ” 방법

// Number μƒμ„±μž ν•¨μˆ˜ 이용
Number('0') // 0
Number('-1') // -1

2. parseInt, parseFloat ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜λŠ” 방법(λ¬Έμžμ—΄λ§Œ 숫자 νƒ€μž…μœΌλ‘œ λ³€ν™˜ κ°€λŠ₯)

// parseInt, parseFloat ν•¨μˆ˜ μ‚¬μš©(λ¬Έμžμ—΄λ§Œ λ³€ν™˜ κ°€λŠ₯)
parseInt('0') // 0
parseFloat('10.53') // 10.53

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

  1. Boolean μƒμ„±μž ν•¨μˆ˜λ₯Ό new μ—°μ‚°μž 없이 ν˜ΈμΆœν•˜λŠ” 방법
  2. ! λΆ€μ • 논리 μ—°μ‚°μžλ₯Ό 두 번 μ‚¬μš©ν•˜λŠ” 방법

1. Boolean μƒμ„±μž ν•¨μˆ˜λ₯Ό new μ—°μ‚°μž 없이 ν˜ΈμΆœν•˜λŠ” 방법

Boolean(0) // false
Boolean("") // false
Boolean("false") // true

2. ! λΆ€μ • 논리 μ—°μ‚°μžλ₯Ό 두 번 μ‚¬μš©ν•˜λŠ” 방법

!!0 // false
!!"" // false
!!"false" // true

λΆ€μ • 논리 μ—°μ‚°μžλ₯Ό ν•œ 번 μ‚¬μš©ν•΄λ„ λΆˆλ¦¬μ–Έ νƒ€μž…μœΌλ‘œ λ³€ν™˜λœλ‹€.

console.log(typeof 0) // number
console.log(typeof !0) // boolean trueκ°’ λ°˜ν™˜

4. 단좕 평가

논리 μ—°μ‚°μ˜ κ²°κ³Όλ₯Ό κ²°μ •ν•˜λŠ” ν”Όμ—°μ‚°μžλ₯Ό νƒ€μž… λ³€ν™˜ν•˜μ§€ μ•Šκ³  κ·ΈλŒ€λ‘œ λ°˜ν™˜ 이λ₯Ό 단좕 평가라 ν•˜λ©° 단좕 ν‰κ°€λŠ” ν‘œν˜„μ‹μ„ ν‰κ°€ν•˜λŠ” 도쀑에 평가 κ²°κ³Όκ°€ ν™•μ •λœ 경우 λ‚˜λ¨Έμ§€ 평가 과정을 μƒλž΅ν•˜λŠ” 것을 λ§ν•œλ‹€.

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

논리곱(&&) μ—°μ‚°μžμ™€ 논리합(||) μ—°μ‚°μžλŠ” μ–Έμ œλ‚˜ 2개의 ν”Όμ—°μ‚°μž 쀑 μ–΄λŠ ν•œμͺ½μœΌλ‘œ ν‰κ°€λœλ‹€.

논리곱(&&) : 논리곱 μ—°μ‚°μž 두 개의 ν”Όμ—°μ‚°μžκ°€ λͺ¨λ‘ true둜 평가될 λ•Œ trueλ₯Ό λ°˜ν™˜ν•œλ‹€. 논리곱 μ—°μ‚°μžλŠ” μ’Œν•­μ—μ„œ μš°ν•­μœΌλ‘œ 평가 μ§„ν–‰ν•œλ‹€.

"Cat" && "Dog" // Dog
  • 첫번째 ν”Όμ—°μ‚°μž "Cat"은 Truthy κ°’μ΄λ―€λ‘œ true둜 평가 ν•˜μ§€λ§Œ 이 μ‹œμ κΉŒμ§€λŠ” μœ„ ν‘œν˜„μ‹μ„ 평가할 수 μ—†λ‹€.
  • 두 번째 ν”Όμ—°μ‚°μžκΉŒμ§€ 평가해 보아야 μœ„ ν‘œν˜„μ‹μ„ 평가할 수 μžˆλ‹€. λ‹€μ‹œ 말해, 두 번째 ν”Όμ—°μ‚°μžκ°€ 논리곱 μ—°μ‚°μž ν‘œν˜„μ‹μ˜ 평가 κ²°κ³Όλ₯Ό κ²°μ •.
  • 두 번째 ν”Όμ—°μ‚°μž "Dog"λ₯Ό κ·ΈλŒ€λ‘œ λ°˜ν™˜

논리합(||) : 논리합 μ—°μ‚°μž 두 개의 ν”Όμ—°μ‚°μž 쀑 ν•˜λ‚˜λ§Œ true둜 ν‰κ°€λ˜μ–΄λ„ trueλ₯Ό λ°˜ν™˜ 논리합 μ—°μ‚°μžλ„ μ’Œν•­μ—μ„œ μš°ν•­μœΌλ‘œ 평가 μ§„ν–‰ν•œλ‹€.

"Cat" || "Dog" // Cat
  • 첫번째 ν”Όμ—°μ‚°μž "Cat은 Truthy κ°’μ΄λ―€λ‘œ ture둜 평가 이 μ‹œμ μ— 두 번째 ν”Όμ—°μ‚°μžκΉŒμ§€ 평가해 보지 μ•Šμ•„λ„ μœ„ ν‘œν˜„μ‹μ„ 평가할 수 μžˆλ‹€. * μ΄λ•Œ 논리합 μ—°μ‚°μžλŠ” 논리 μ—°μ‚°μ˜ κ²°κ³Όλ₯Ό κ²°μ •ν•œ 첫 번째 ν”Όμ—°μ‚°μž, 즉 λ¬Έμžμ—΄ "Cat"을 κ·ΈλŒ€λ‘œ λ°˜ν™˜ν•œλ‹€.

πŸ’‘ 단좕 ν‰κ°€λŠ” λ‹€μŒμ˜ κ·œμΉ™μ„ λ”°λ₯Έλ‹€.

true || anything // true
false || anything // anything
true && anything // anything
false && anything // false

πŸ’‘ 단좕 ν‰κ°€λŠ” λ‹€μŒκ³Ό 같은 μƒν™©μ—μ„œ μœ μš©ν•˜λ‹€

  • 객체λ₯Ό 가리킀기λ₯Ό κΈ°λŒ€ν•˜λŠ” λ³€μˆ˜κ°€ null λ˜λŠ” undefinedκ°€ μ•„λ‹Œμ§€ ν™•μΈν•˜κ³  ν”„λ‘œνΌν‹°λ₯Ό μ°Έμ‘°ν•  λ•Œ
  • ν•¨μˆ˜ λ§€κ°œλ³€μˆ˜μ— 기본값을 μ„€μ •ν•  λ•Œ

4.2 μ˜΅μ…”λ„ 체이닝 μ—°μ‚°μž

ES11μ—μ„œ λ„μž…λœ μ˜΅μ…”λ„ 체이닝 μ—°μ‚°μž ?.λŠ” μ’Œν•­μ˜ ν”Όμ—°μ‚°μžκ°€ null λ˜λŠ” undefined인 경우 undefinedλ₯Ό λ°˜ν™˜ν•˜κ³  그렇지 μ•ŠμœΌλ©΄ μš°ν•­μ˜ ν”„λ‘œνΌν‹° μ°Έμ‘°λ₯Ό 이어간닀.

μ˜΅μ…”λ„ 체이닝 μ—°μ‚°μž ?.λŠ” 객체λ₯Ό 가리킀기λ₯Ό κΈ°λŒ€ν•˜λŠ” λ³€μˆ˜κ°€ null λ˜λŠ” undefinedκ°€ μ•„λ‹Œμ§€ ν™•μΈν•˜κ³  ν”„λ‘œνΌν‹°λ₯Ό μ°Έμ‘°ν•  λ•Œ 유용.

4.3 null 병합 μ—°μ‚°μž

ES11μ—μ„œ λ„μž…λœ null 병합 μ—°μ‚°μž ??λŠ” μ’Œν•­μ˜ ν”Όμ—°μ‚°μžκ°€ null λ˜λŠ” undefined인 경우 μš°ν•­μ˜ ν”Όμ—°μ‚°μžλ₯Ό λ°˜ν™˜ν•˜κ³ , 그렇지 μ•ŠμœΌλ©΄ μ’Œν•­μ˜ ν”Όμ—°μ‚°μžλ₯Ό λ°˜ν™˜ν•œλ‹€.

null 병합 μ—°μ‚°μž ??λŠ” λ³€μˆ˜μ— 기본값을 μ„€μ •ν•  λ•Œ μœ μš©ν•˜λ‹€.

0개의 λŒ“κΈ€