λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

μΉ΄ν…Œκ³ λ¦¬ μ—†μŒ

[λͺ¨λ”₯λ‹€] 09μž₯ νƒ€μž… λ³€ν™˜κ³Ό 단좕 평가

728x90

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

κ°œλ°œμžκ°€ μ˜λ„μ μœΌλ‘œ νƒ€μž…μ„ λ³€ν™˜ν•˜λŠ” 것 : λͺ…μ‹œμ  νƒ€μž… λ³€ν™˜ ν˜Ήμ€ νƒ€μž… μΊμŠ€νŒ… 이라고 함. 

JS 엔진에 μ˜ν•΄ νƒ€μž…μ΄ λ³€ν™˜λ˜λŠ” 것 : 암묡적 νƒ€μž… λ³€ν™˜ λ˜λŠ” νƒ€μž… κ°•μ œ λ³€ν™˜ 이라고 함. 

 

두 νƒ€μž…μ˜ λ³€ν™˜ λͺ¨λ‘ κΈ°μ‘΄ μ›μ‹œ 값을 직접 λ³€κ²½ν•˜λŠ” 것은 μ•„λ‹ˆλ‹€.

πŸ“Œνƒ€μž… λ³€ν™˜μ΄ μΌμ–΄λ‚˜λŠ”μ§€ μ½”λ“œλ₯Ό μ˜ˆμΈ‘ν•  수 μžˆμ–΄μ•Ό ν•œλ‹€. 

암묡적 νƒ€μž…μ€ λ°œμƒν•˜μ§€ μ•Šλ„λ‘ ν†΅μ œν•  수 μ—†μŒ. 

 

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

- string + nuber => string+string

- string*number => number

!0 => true

 

1 + '2' -> '12'

 

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

μœ„μ—μ„œ 봀듯이 '+' μ—°μ‚°μžλŠ” ν”Όμ—°μ‚°μž 쀑 ν•˜λ‚˜κ°€ λ¬Έμžμ—΄μ΄λ©΄ λ¬Έμžμ—΄ μ—°κ²° μ—°μ‚°μžλ‘œ λ™μž‘ν•œλ‹€.

console.log(10 + "10"); // 1010

μ•„λž˜μ˜ μ½”λ“œλ„ λ¬Έμžμ—΄ μ—°κ²° μ—°μ‚°μžλ‘œ λ™μž‘ν•œ κ²°κ³Όλ₯Ό 확인할 수 μžˆλ‹€.

console.log(2 + "1" + 5); // 2715
console.log(2 + 7 + "1" + 5); // 주의 : 이 κ²°κ³ΌλŠ” 915λ‹€.

λ‘λ²ˆμ§Έλ„ 전체가 λ‹€ λ¬Έμžμ—΄ μ—°κ²°λ‘œ λ™μž‘ν• κΉŒ? ν•˜κ³  ν…ŒμŠ€νŠΈλ₯Ό ν•΄λ³΄μ•˜λŠ”λ° μ•žμ— 2 + 7은 숫자 μ—°μ‚°μœΌλ‘œ μ²˜λ¦¬λœλ‹€.
λ¬Έμžμ—΄ νƒ€μž…μœΌλ‘œ 암묡적 λ³€ν™˜μ΄ μ΄λ£¨μ–΄μ§€λŠ” 좔가적인 μ˜ˆμ‹œλŠ” μ•„λž˜μ™€ κ°™λ‹€.

0 + '' // '0'
-0 + '' // '0'
NaN + 'a' // NaNa
Infinity + '' // 'Infinity'
-Infinity + '' // '-Infinity'

true + ' ' + false + '' // 'true false'

[] + '' // ''
[1,2] + '' // '1,2'

Symbol() + '' // TypeError

이 외에 κΆκΈˆν•œ 것이 μžˆλ‹€λ©΄ 직접 ν•΄λ³΄λ©΄μ„œ 확인해보면 쒋을 것 κ°™λ‹€. λ§ˆμ§€λ§‰μ— Symbol()은 string νƒ€μž…μœΌλ‘œ λ³€ν™˜ν•  수 μ—†λ‹€.

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

'+' 단항 μ—°μ‚°μžλŠ” ν”Όμ—°μ‚°μžκ°€ 숫자 νƒ€μž…μ˜ 값이 μ•„λ‹ˆλ©΄, 숫자 νƒ€μž…μ˜ κ°’μœΌλ‘œ μ•”λ¬΅μ μœΌλ‘œ νƒ€μž… λ³€ν™˜μ„ μˆ˜ν–‰ν•œλ‹€.

+'' // 0
+'0' // 0
+'1' // 1
+'hello' // NaN

+true // 1
+false // 0

+null // 0
+[] // 0
+[1,2] // NaN
+function(){} // NaN

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

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

if ("") console.log("test1");
if (true) console.log("test2");
if (0) console.log("test3");
if ("a") console.log("test4");
if (null) console.log("test5");

// test2
// test4

=> μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진은 λΆˆλ¦¬μ–Έ νƒ€μž…μ΄ μ•„λ‹Œ 값을 Truthy(참으둜 ν‰κ°€λ˜λŠ” κ°’) λ˜λŠ” Falsy(κ±°μ§“μœΌλ‘œ ν‰κ°€λ˜λŠ” κ°’)으둜 κ΅¬λΆ„ν•œλ‹€.

  • false둜 ν‰κ°€λ˜λŠ” κ°’ : false, undefined, null, 0, -0, NaN, ''
  • true둜 ν‰κ°€λ˜λŠ” κ°’ : falseκ°€ μ•„λ‹Œ λͺ¨λ“  κ°’. {}, [] 와 같은 것듀도 λͺ¨λ‘ true둜 평가됨.

 

 

9.4 단좕 평가

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

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

// 논리곱(&&) μ—°μ‚°μž
'a'   && 'b'   // => 'b'
false && 'b'   // => false
'a'   && false // => false

// 논리합(||) μ—°μ‚°μž
'a'   || 'b'   // => 'a'
false || 'b'   // => 'b'
'a'   || false // => 'a'

단좕 평가λ₯Ό μ‚¬μš©ν•˜λ©΄ if 문을 λŒ€μ²΄ν•  수 μžˆλ‹€. μ–΄λ–€ 쑰건이 true μ—¬μ•Ό μ‹€ν–‰λ˜μ–΄μ•Ό ν•œλ‹€λ©΄, 논리곱(&&) μ—°μ‚°μž ν‘œν˜„μ‹μœΌλ‘œ 이λ₯Ό λŒ€μ²΄ν•˜κ³ , 쑰건이 false μ—¬μ•Ό μ‹€ν–‰λ˜μ–΄μ•Ό ν•œλ‹€λ©΄ 논리합(||) μ—°μ‚°μž ν‘œν˜„μ‹μœΌλ‘œ 이λ₯Ό λŒ€μ²΄ν•  수 μžˆλ‹€.

 

 

 

728x90
λ°˜μ‘ν˜•