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

λ…μ„œ λͺ©λ‘/λͺ¨λ”₯λ‹€ Modern JS Deep Dive

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

728x90

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

 

1️⃣ λͺ…μ‹œμ  νƒ€μž… λ³€ν™˜ (=== νƒ€μž… μΊμŠ€νŒ…) 

: κ°œλ°œμžκ°€ μ˜λ„μ μœΌλ‘œ κ°’μ˜ νƒ€μž…μ„ λ³€ν™˜ν•˜λŠ” 것. 

 

2️⃣ 암묡적 νƒ€μž… λ³€ν™˜ (=== νƒ€μž… κ°•μ œ λ³€ν™˜)

: μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진에 μ˜ν•΄ μ•”λ¬΅μ μœΌλ‘œ νƒ€μž…μ΄ μžλ™ λ³€ν™˜λ˜λŠ” 것. 

 

βœ… νƒ€μž… λ³€ν™˜μ΄ μ›μ‹œκ°’μ„ 직접 λ³€κ²½ν•˜λŠ” 것은 μ•„λ‹˜. 

=> νƒ€μž… λ³€ν™˜μ΄λž€ κΈ°μ‘΄ μ›μ‹œ 값을 μ‚¬μš©ν•΄ λ‹€λ₯Έ νƒ€μž…μ˜ μƒˆλ‘œμš΄ μ›μ‹œ 값을 μƒμ„±ν•˜λŠ” 것. 

-> μƒˆλ‘œμš΄ νƒ€μž…μ˜ 값을 λ§Œλ“€μ–΄ 단 ν•œλ²ˆ κ°€μš©ν•˜κ³  버림. 

 

암묡적 νƒ€μž… λ³€ν™˜μ€ μ½”λ“œ μƒμ—μ„œ λͺ…λ°±νžˆ λ‚˜νƒ€λ‚˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ—, 

개발자 μžμ‹ μ΄ μž‘μ„±ν•œ μ½”λ“œμ—μ„œ 암묡적 νƒ€μž… λ³€ν™˜μ΄ λ°œμƒν•˜λŠ”μ§€, 

λ°œμƒν•œλ‹€λ©΄ μ–΄λ–€ κ°’μœΌλ‘œ λ³€ν™˜λ˜λŠ”μ§€, 

그리고 νƒ€μž… λ³€ν™˜λœ κ°’μœΌλ‘œ ν‘œν˜„μ‹μ΄ μ–΄λ–»κ²Œ 평가될 것인지 예츑 κ°€λŠ₯ν•΄μ•Ό ν•œλ‹€.

 

=> νƒ€μž… λ³€ν™˜μ΄ μ–΄λ–»κ²Œ λ™μž‘ν•˜λŠ”μ§€ 정확이 μ΄ν•΄ν•˜κ³  μ‚¬μš©ν•΄μ•Όν•œλ‹€. 

 

 

 

 

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

 

- κ°œλ°œμžμ™€ 상관 μ—†λŠ” μžλ°”μŠ€ν¬λ¦½νŠΈ μ—”μ§„μ˜ κ°•μ œμ  λ³€ν™˜

- λ¬Έμžμ—΄, 숫자, λΆˆλ¦¬μ–Έ κ³Ό 같은 μ›μ‹œνƒ€μž… 쀑 ν•˜λ‚˜λ‘œ μžλ™ λ³€ν™˜λ¨. 

 

 

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

 

1 + '2' = '12'

+ : ν”Όμ—°μ‚°μž 쀑 ν•˜λ‚˜κ°€ λ¬Έμžμ΄λ―€λ‘œ λ¬Έμžμ—΄ μ—°κ²° μ—°μ‚°μžλ‘œ λ™μž‘. 

 

`1 + 1  = ${1 + 1}` // "1 + 1 = 2"

 

λ¦¬ν„°λŸ΄ ν‘œν˜„μ‹ μ‚½μž…λ„ 평가 κ²°κ³Όλ₯Ό λ¬Έμžμ—΄ νƒ€μž…μœΌλ‘œ 암묡적 νƒ€μž… λ³€ν™˜. 

 

+ '' λ₯Ό ν•˜λ©΄ λ‹€ λ¬Έμžμ—΄λ‘œ 변화됨. 

ex)

NaN + "" => "NaN"

null + "" => "null" 

({}) + "" => "[object object]"

[10, 20] + "" => "10, 20"  πŸ”–

 

 

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

 

μ‚°μˆ  μ—°μ‚°μžμ˜ μ—­ν•  : 숫자 값을 λ§Œλ“œλŠ” 것. 

=> μ‚°μˆ  μ—°μ‚°μžμ˜ ν”Όμ—°μ‚°μžλŠ” μ½”λ“œ λ¬Έλ§₯상 λͺ¨λ‘ μˆ«μžνƒ€μž…μ΄μ—¬μ•Ό. 

μˆ«μžνƒ€μž…μœΌλ‘œ λ³€ν™˜ν•˜μ§€ λͺ»ν•  경우 ν‘œν˜„μ‹μ˜ 평가 κ²°κ³ΌλŠ” NaN 이 λœλ‹€. 

 

> 비ꡐ μ—°μ‚°μžλ„ 비ꡐλ₯Ό ν•΄μ•Όν•˜κΈ° λ•Œλ¬Έμ—, ν”Όμ—°μ‚°μžκ°€ μˆ«μžμ—¬μ•Όν•¨. 

=> ν”Όμ—°μ‚°μž 쀑 숫자 νƒ€μž…μ΄ μ•„λ‹Œ 건 μˆ«μžνƒ€μž…μœΌλ‘œ 암묡적 λ³€ν™˜ν•¨. 

 

+ λ₯Ό 뢙이면 κ°„λ‹¨ν•˜κ²Œ μˆ«μžνƒ•λΉ„μœΌλ‘œ 암묡적 λ³€ν™˜μ„ μ‹œν‚¬ 수 μžˆλ‹€. 

 

빈 λ¬Έμžμ—΄(' '), 빈 λ°°μ—΄([ ]) , null, false  => 0

true => 1

객체, λΉˆλ°°μ—΄μ΄ μ•„λ‹Œ λ°°μ—΄, undifinedλŠ” λ³€ν™˜ x -> NaN κ°€ 됨. 

 

 

 

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

 

if λ¬Έ, for λ¬Έ λ“±μ˜ 쑰건식은 λΆˆλ¦¬μ–Έκ°’μœΌλ‘œ ν‰κ°€λ˜μ–΄μ•Όν•¨. 

 

Truthy κ°’ (μ°Έκ°’μœΌλ‘œ ν‰κ°€λ˜λŠ” κ°’)

- falsy κ°’ μ™Έμ˜ 무든 κ°’

 

Falsy κ°’ (κ±°μ§“μœΌλ‘œ ν‰κ°€λ˜λŠ” κ°’)

- false

- undifined

- null

- 0, -0

- NaN

- 빈 λ¬Έμžμ—΄ ''

 

βœ… ν—·κ°ˆλ¦΄ 수 μžˆλŠ” Truthy

- {}

- []

- '0'

 

 

 

 

 

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

 

κ°œλ°œμžκ°€ μ˜λ„μ μœΌλ‘œ νƒ€μž…μ„ λ³€ν™˜ν•˜λŠ” 방법

1️⃣ ν‘œμ€€ 빌트인 μƒμ„±μž ν•¨μˆ˜λ₯Ό new 없이 ν˜ΈμΆœν•˜λŠ” 방법

2️⃣ 빌트인 λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜λŠ” 방법

3️⃣ 암묡적 νƒ€μž… λ³€ν™˜μ„ μ΄μš©ν•˜λŠ” 방법

 

 

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

 

1️⃣ String ν•¨μˆ˜λ₯Ό new μ—°μ‚°μž 없이 호좜

String(1); // "1"

2️⃣ .toString() 이용

(Infinity).toString(); // "Infinity"

3️⃣ λ¬Έμžμ—΄ μ—°κ²° μ—°μ‚°μžλ₯Ό 이용

1 + '';  // "1"
true + ''; // "true"
NaN + ''; // 'NaN'

 

 

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

 

1️⃣ Number μƒμ„±μž ν•¨μˆ˜λ₯Ό new μ—°μ‚°μž 없이 호좜

2️⃣ parseInt, parseFloat ν•¨μˆ˜ 이용 (λ¬Έμžμ—΄λ§Œ λ³€ν™˜ κ°€λŠ₯)

parseInt('0') // 0

3️⃣ + 단항 μ‚°μˆ  μ—°μ‚°μž 이용

+'1';  // 1
+true; // 1

4️⃣ * μ‚°μˆ  μ—°μ‚°μžλ₯Ό 이용

'1' * 1;  // 1
true * 1; // 1

 

 

 

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

 

1️⃣ Boolean μƒμ„±μž ν•¨μˆ˜λ₯Ό new μ—°μ‚°μž 없이 호좜

2️⃣ ! 뢀정논리 μ—°μ‚°μžλ₯Ό λ‘λ²ˆ μ‚¬μš©

 

 

 

 

🌿 9.4 단좕 평가

 

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

 

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

 

논리곱  &&

: 두 κ°’ λͺ¨λ‘ true 둜 평가 될 λ•Œ true λ₯Ό λ°˜ν™˜. 

μ’Œν•­ -> μš°ν•­ 으둜 평가 진행

μ’Œν•­μ΄ true -> μš°ν•­ 진행 : λ‘λ²ˆμ§Έ ν”Όμ—°μ‚°μžκ°€ 논리곱 μ—°μ‚°μž ν‘œν˜„μ‹μ˜ 평가 κ²°κ³Όλ₯Ό κ²°μ •

 

논리합 || 

: ν•˜λ‚˜λ§Œ true둜 ν‰κ°€λ˜μ–΄λ„ true λ°˜ν™˜. 

μ’Œν•­μ΄ true λ©΄ 뒀에껀 계산 μ•ˆν•¨. 

 

단좕 평가

: 논리 μ—°μ‚°μ˜ κ²°κ³Όλ₯Ό κ²°μ •ν•˜λŠ” ν”Όμ—°μ‚°μžλ₯Ό νƒ€μž… λ³€ν™˜ν•˜μ§€ μ•Šκ³  κ·ΈλŒ€λ‘œ 진행

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

 

-> if λ¬Έ λŒ€μ²΄ κ°€λŠ₯. 

 

 

< 단좕평가가 μœ μš©ν•˜κ²Œ μ“°μ΄λŠ” 상황듀 >

 

🎡 객체λ₯Ό 가리킀지λ₯Ό κΈ°λŒ€ν•˜λŠ” λ³€μˆ˜κ°€ null λ˜λŠ” undefined κ°€ μ•„λ‹Œμ§€ ν™•μΈν•˜κ³  ν”„λ‘œνΌν‹°λ₯Ό μ°Έκ³ ν•  λ•Œ.

-> κΈ°λŒ€ν•˜λŠ” λ³€μˆ˜μ˜ 값이 null λ˜λŠ” undefined 인 경우 

const elem;

const value = elem && elem.value;

 

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

- 인수 전달 μ•ˆν•˜λ©΄ undefined κ°€ λ˜λŠ”λ° 이λ₯Ό 방지함. 

...
str = str || ''

 

 

 

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

 

μ’Œν•­μ˜ ν”Όμ—°μ‚°μžκ°€ null λ˜λŠ” undefined 인 경우, undefined λ₯Ό λ°˜ν™˜ν•˜κ³  그렇지 μ•ŠμœΌλ©΄ μš°ν•­μ˜ ν”„λ‘œνΌμΉ˜ 팜쑰λ₯Ό 이어감. 

elem?.value //elemκ°€ 있으면 value λ₯Ό κ°€μ Έμ˜΄

 

μ˜΅μ…”λ„ 체이닝이 생기기 μ „μ—λŠ”, && λ₯Ό μ‚¬μš©ν•¨

- ν•˜μ§€λ§Œ 0, '' 인 κ²½μš°λŠ” 객체둜 평가될 λ•Œκ°€ μžˆμ–΄μ„œ 뢀정확함. 

const str = '';

const length = str && str.length;

console.log(length) // ''

=> λ¬Έμžμ—΄μ˜ 길이λ₯Ό μ°Έμ‘°ν•˜μ§€ λͺ»ν–ˆμŒ. 

 

μ˜΅μ…”λ„ 체이닝 : Falsy κ°’ κ³Ό null, undefined κΉŒμ§€ ν¬ν•¨ν•œ 값이면 -> μš°ν•­μ˜ ν”„λ‘œνΌν‹° 참쑰둜 감.

 

 

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

?? 

μ’Œν•­μ˜ ν”Όμ—°μ‚°μžκ°€ null λ˜λŠ” undefined 인 경우 μš°ν•­ λ°˜ν™˜, 

그렇지 μ•ŠμœΌλ©΄ μ’Œν•­ λ°˜ν™˜

 

??λŠ” λ³€μˆ˜μ— 기본값을 μ„€μ •ν•  λ•Œ μœ μš©ν•¨. 

μ–˜λ„ μ „μ—λŠ” || κ°€ λŒ€μ‹  μ‚¬μš©λλŠ”λ°, 

'', 0 을 κ°€μ§ˆ 경우 에도 κΈ°λ³Έκ°’μœΌλ‘œ μœ νš¨ν–ˆκΈ° λ•Œλ¬Έμ— 예기치 μ•Šμ€ λ™μž‘μ΄ λ°œμƒν•¨. 

ν•˜μ§€λ§Œ ?? λŠ” Falsy κ°’, 이라도 null, undefinde κ°€ μ•„λ‹ˆλ©΄ μ’Œν•­μ˜ ν”Όμ—°μ‚°μžλ₯Ό κ·Έλž˜λ„ λ°˜ν™˜. 

 

 

728x90
λ°˜μ‘ν˜•