관리 메뉴

Daehyunii's Dev-blog

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

πŸ“š Language & CS knowledge/JavaScript (λͺ¨λ˜μžλ°”μŠ€ν¬λ¦½νŠΈ Deep Dive)

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

Daehyunii 2022. 6. 28. 18:23

 

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

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

  μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ λͺ¨λ“  값은 νƒ€μž…μ΄ μžˆλ‹€. κ°’μ˜ νƒ€μž…μ€ 개발자의 μ˜λ„μ— 따라 λ‹€λ₯Έ νƒ€μž…μœΌλ‘œ λ³€ν™˜ν•  수 μžˆλ‹€. κ°œλ°œμžκ°€ μ˜λ„μ μœΌλ‘œ κ°’μ˜ νƒ€μž…μ„ λ³€ν™˜ν•˜λŠ” 것을 λͺ…μ‹œμ  νƒ€μž… λ³€ν™˜ λ˜λŠ” νƒ€μž… μΊμŠ€νŒ…μ΄λΌ ν•œλ‹€. λ°˜λŒ€λ‘œ, 개발자의 μ˜λ„μ™€λŠ” 상관없이 ν‘œν˜„μ‹μ„ ν‰κ°€ν•˜λŠ” 도쀑에 μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진에 μ˜ν•΄ μ•”λ¬΅μ μœΌλ‘œ νƒ€μž…μ΄ μžλ™ λ³€ν™˜λ˜κΈ°λ„ ν•œλ‹€. 이λ₯Ό μ•”묡적 νƒ€μž… λ³€ν™˜ λ˜λŠ” νƒ€μž… κ°•μ œ λ³€ν™˜μ΄λΌ ν•œλ‹€. νƒ€μž… λ³€ν™˜μ΄λž€ κΈ°μ‘΄ μ›μ‹œ 값을 μ‚¬μš©ν•΄ λ‹€λ₯Έ νƒ€μž…μ˜ μƒˆλ‘œμš΄ μ›μ‹œ 값을 μƒμ„±ν•˜κ³  μƒμ„±λœ κ°’μœΌλ‘œ ν‘œν˜„μ‹μ„ ν‰κ°€ν•œλ‹€. μ΄λ•Œ μ£Όμ˜ν•΄μ•Ό ν•  점은 μƒˆλ‘œ μƒμ„±λœ μ›μ‹œ νƒ€μž…μ˜ 값이 κΈ°μ‘΄ λ³€μˆ˜ 값에 μž¬ν• λ‹Ήν•˜μ—¬ λ³€κ²½ν•˜λŠ” 것이 μ•„λ‹ˆλΌ, ν•œ 번만 μ‚¬μš©ν•œ ν›„ λ²„λ¦¬κ²Œ λœλ‹€. (μ›μ‹œ 값은 λ³€κ²½ λΆˆκ°€λŠ₯ν•œ 값이닀.)

 

9.2 암묡적 νƒ€μž… λ³€ν™˜(νƒ€μž… κ°•μ œ λ³€ν™˜)

  각 μ—°μ‚°μž 등을 μ‚¬μš©ν• λ•Œ λ°˜ν™˜ν•˜κ³ μž ν•˜λŠ” 값이 있고, ν•„μš”ν•œ ν”Όμ—°μ‚°μžμ˜ 값이 μ •ν•΄μ Έ μžˆλ‹€. ν•„μš”ν•œ ν”Όμ—°μ‚°μžμ˜ 값이 μ—†λ‹€λ©΄ μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진은 암묡적 νƒ€μž… λ³€ν™˜μ„ 톡해 ν•„μš”ν•œ νƒ€μž…μ˜ 값을 μƒμ„±ν•˜μ—¬ ν‘œν˜„μ‹μ„ ν‰κ°€ν•˜κ²Œ λœλ‹€. 암묡적 νƒ€μž… λ³€ν™˜μ΄ λ°œμƒν•˜λ©΄ λ¬Έμžμ—΄, 숫자, λΆˆλ¦¬μ–Έκ³Ό 같은 μ›μ‹œ νƒ€μž… 쀑 ν•˜λ‚˜λ‘œ νƒ€μž…μ„ μžλ™ λ³€ν™˜ν•œλ‹€.

 

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

1) λ¬Έμžμ—΄ μ—°κ²° μ—°μ‚°μž : λ¬Έμžμ—΄ 값을 λ§Œλ“€μ–΄ 냄(κ·ΈλŸ¬λ―€λ‘œ, ν”Όμ—°μ‚°μžλŠ” λ¬Έμžμ—΄μ΄ ν•„μš”ν•¨)

ex) 0 + ' ' : "0"

ex) -0 + ' ' : "0"

2) ν…œν”Œλ¦Ώ λ¦¬ν„°λŸ΄ ν‘œν˜„μ‹ μ‚½μž… : λ¬Έμžμ—΄ 값을 λ§Œλ“€μ–΄ 냄(κ·ΈλŸ¬λ―€λ‘œ, ν‘œν˜„μ‹μ€ λ¬Έμžμ—΄μ΄ ν•„μš”ν•¨)

 

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

1) μ‚°μˆ  μ—°μ‚°μž : 숫자 값을 λ§Œλ“€μ–΄ 냄(κ·ΈλŸ¬λ―€λ‘œ, ν”Όμ—°μ‚°μžλŠ” 숫자 값이 ν•„μš”ν•¨)

2) λŒ€/μ†Œ 관계 비ꡐ μ—°μ‚°μž : λΆˆλ¦¬μ–Έ 값을 λ§Œλ“€μ–΄ 냄(κ·ΈλŸ¬λ―€λ‘œ, ν”Όμ—°μ‚°μžλŠ” 숫자 값이 ν•„μš”ν•¨)

숫자 κ°’ 0 μœΌλ‘œ λ³€ν™˜λ˜λŠ” κ°’λ“€ 숫자 κ°’ 1 λ‘œ λ³€ν™˜λ˜λŠ” κ°’λ“€ 숫자 κ°’ NaN μœΌλ‘œ λ³€ν™˜λ˜λŠ” κ°’λ“€
빈 λ¬Έμžμ—΄ true 빈 λ¬Έμžμ—΄μ΄ μ•„λ‹Œ λ¬Έμžμ—΄(λ¬Έμžμ—΄μ΄ 숫자인 경우 μ œμ™Έ)
빈 λ°°μ—΄   빈 배열이 μ•„λ‹Œ λ°°μ—΄
false   undefined
null   객체

 

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

  falsy둜 ν‰κ°€λ˜μ–΄ false둜 암묡적 νƒ€μž… λ³€ν™˜μ΄ μ΄λ€„μ§€λŠ” κ°’ 6가지(이 μ΄μ™Έμ˜ λͺ¨λ“  값은 truthy둜 ν‰κ°€λ˜μ–΄ true둜 νƒ€μž… λ³€ν™˜μ΄ 이뀄진닀.)

1) false

2) undefined

3) null

4) 0, -0

5) NaN

6) ' '(빈 λ¬Έμžμ—΄)

 

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

  개발자의 μ˜λ„μ— 따라 λͺ…μ‹œμ μœΌλ‘œ νƒ€μž…μ„ λ³€κ²½ν•˜λŠ” 방법은 λ‹€μ–‘ν•˜λ‹€.

1) ν‘œμ€€ 빌트인 μƒμ„±μž ν•¨μˆ˜ : 객체λ₯Ό μƒμ„±ν•˜κΈ° μœ„ν•œ ν•¨μˆ˜(new μ—°μ‚°μžμ™€ ν•¨κ»˜ ν˜ΈμΆœν•œλ‹€.)

2) ν‘œμ€€ 빌트인 λ©”μ„œλ“œ : 빌트인 객체의 λ©”μ„œλ“œ

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

 

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

  λ¬Έμžμ—΄ νƒ€μž…μ΄ μ•„λ‹Œ 값을 λ¬Έμžμ—΄ νƒ€μž…μœΌλ‘œ λ³€ν™˜ν•˜λŠ” 방법이닀.

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

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

3) λ¬Έμžμ—΄ μ—°κ²° μ—°μ‚°μžλ₯Ό μ΄μš©ν•˜λŠ” 방법

//1.String μƒμ„±μž ν•¨μˆ˜λ₯Ό newμ—°μ‚°μž 없이 ν˜ΈμΆœν•˜λŠ” 방법
console.log(String(1)); 
console.log(String(NaN));
console.log(String(Infinity));
console.log(String(true));
console.log(String(false));

//2.object.prototype.toString λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜λŠ” 방법
console.log((1).toString());
console.log((NaN).toString());
console.log((Infinity).toString());
console.log((true).toString());
console.log((false).toString());

//3.λ¬Έμžμ—΄ μ—°κ²° μ—°μ‚°μžλ₯Ό μ΄μš©ν•˜λŠ” 방법
console.log(1 + '');
console.log(NaN + '');
console.log(Infinity + '');

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

  숫자 νƒ€μž…μ΄ μ•„λ‹Œ 값을 숫자 νƒ€μž…μœΌλ‘œ λ³€ν™˜ν•˜λŠ” 방법이닀.

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

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

3) + 단항 μ‚°μˆ  μ—°μ‚°μžλ₯Ό μ΄μš©ν•˜λŠ” 방법

4) * 이항 μ‚°μˆ  μ—°μ‚°μžλ₯Ό μ΄μš©ν•˜λŠ” 방법

//1.Number μƒμ„±μž ν•¨μˆ˜λ₯Ό new μ—°μ‚°μž 없이 ν˜ΈμΆœν•˜λŠ” 방법
console.log(Number('0'));
console.log(Number('-1'));
console.log(Number('10.53'));
console.log(Number(true));
console.log(Number(false));

//2.parseInt, parseFloat ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜λŠ” 방법(λ¬Έμžμ—΄λ§Œ λ³€ν™˜μ΄ κ°€λŠ₯)
console.log(parseInt('0'));
console.log(parseInt('3')); //μ‹€μˆ˜λ₯Ό 넣어도 μ •μˆ˜ 숫자 κ°’λ§Œ λ°˜ν™˜ν•¨
console.log(parseFloat('3.14'));

//3.단항 μ‚°μˆ  μ—°μ‚°μž + λ₯Ό μ΄μš©ν•˜λŠ” 방법
console.log(+'10');
console.log(+'3.14');
console.log(+true);
console.log(+false);
console.log(+undefined);
console.log(+null);
console.log(+'hello');
console.log(+'');
console.log(+'53');

//4.이항 μ‚°μˆ  μ—°μ‚°μž  * λ₯Ό μ΄μš©ν•˜λŠ” 방법
console.log(1 * '1');
console.log(1 * '-1');
console.log(1 * '0');
console.log(1 * '10.53');
console.log(1 * true);
console.log(1 * false);

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

  λΆˆλ¦¬μ–Έ νƒ€μž…μ΄ μ•„λ‹Œ 값을 λΆˆλ¦¬μ–Έ νƒ€μž…μœΌλ‘œ λ³€ν™˜ν•˜λŠ” 방법이닀.

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

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

//1.Boolean μƒμ„±μž ν•¨μˆ˜λ₯Ό new μ—°μ‚°μž 없이 ν˜ΈμΆœν•˜λŠ” 방법
//μ•žμ„œ 배운 λ‚΄μš©μ²˜λŸΌ falsy둜 ν‰κ°€λ˜λŠ” 6가지λ₯Ό μ œμ™Έν•˜κ³ λŠ” μ „λΆ€ true값을 λ°˜ν™˜ν•¨
console.log(Boolean('')); //false 
console.log(Boolean(0)); //false 
console.log(Boolean(-0)); //false 
console.log(Boolean(undefined)); //false 
console.log(Boolean(null)); //false 
console.log(Boolean(false)); //false 
console.log(Boolean(NaN)); //false 


//2.λΆ€μ • 논리 μ—°μ‚°μž ! λ₯Ό 두 번 μ‚¬μš©ν•˜λŠ” 방법
console.log(!!'x'); //true
console.log(!!''); //false 
console.log(!!NaN); //false 
console.log(!!undefined); //false 
console.log(!!0); //false 
console.log(!!-0); //false 
console.log(!!null); //false 
console.log(!!false); //false

 

9.4 단좕 평가

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

  μ•žμ„œ 배운 논리 μ—°μ‚°μž λ…Όλ¦¬κ³±(&&) κ³Ό λ…Όλ¦¬ν•©(||) μ—°μ‚°μž ν‘œν˜„μ‹μ€ μ–Έμ œλ‚˜ 2개의 ν”Όμ—°μ‚°μž 쀑 μ–΄λŠ ν•œμͺ½μœΌλ‘œ ν‰κ°€λœλ‹€. λ…Όλ¦¬κ³± μ—°μ‚°μžμ˜ κ²½μš°μ—λŠ” 두 개의 ν”Όμ—°μ‚°μžκ°€ λͺ¨λ‘ true둜 평가될 λ•Œ trueλ₯Ό λ°˜ν™˜ν•œλ‹€. λ…Όλ¦¬ν•© μ—°μ‚¬μžλŠ” 두 개의 ν”Όμ—°μ‚°μž 쀑 ν•˜λ‚˜λ§Œ true둜 ν‰κ°€λ˜μ–΄λ„ tureλ₯Ό λ°˜ν™˜ν•œλ‹€. 논리합 μ—°μ‚°μžμ™€ 논리곱 μ—°μ‚°μžλŠ” μ’Œν•­μ—μ„œ μš°ν•­μœΌλ‘œ 평가가 μ§„ν–‰λœλ‹€. μ΄λ•Œ 논리곱과 논리합 μ—°μ‚°μžλŠ” 논리 μ—°μ‚°μ˜ κ²°κ³Όλ₯Ό κ²°μ •ν•˜λŠ” ν”Όμ—°μ‚°μžλ₯Ό νƒ€μž… λ³€ν™˜ν•˜μ§€ μ•Šκ³  κ·ΈλŒ€λ‘œ λ°˜ν™˜ν•œλ‹€. μ΄λ₯Ό λ‹¨μΆ• 평가라고 ν•œλ‹€. 즉, λ‹€μ‹œ 말해 λΆˆλ¦¬μ–Έ 값이 μ•„λ‹Œ ν”Όμ—°μ‚°μžλŠ” λΆˆλ¦¬μ–Έ κ°’μœΌλ‘œ 암묡적 νƒ€μž… λ³€ν™˜μ΄ 이뀄져 논리 μ—°μ‚°μ˜ ν‘œν˜„μ‹μ΄ ν‰κ°€λ˜κ³ , 논리 μ—°μ‚°μ˜ κ²°κ³Όλ₯Ό κ²°μ •μ§“λŠ” ν”Όμ—°μ‚°μžμ˜ 값을 κ·ΈλŒ€λ‘œ λ°˜ν™˜ν•΄ μ£ΌλŠ” 것이닀.

//논리곱 μ—°μ‚°μž &&의 단좕평가
console.log('' && 'dog'); // 빈 λ¬Έμžμ—΄μ€ falsy둜 ν‰κ°€λ˜λ―€λ‘œ, κ²°κ³Όλ₯Ό κ²°μ •ν•˜λŠ” '' 이 λ°˜ν™˜λ¨
console.log('cat' && 'dog'); //dog
console.log('cat' && false); //false
console.log(false && 'dog'); //false
console.log(false && false); //첫 번째 ν”Όμ—°μ‚°μž false

//논리합 μ—°μ‚°μž ||의 단좕평가
console.log('cat' || 'dog'); //cat
console.log('cat' || false); //cat
console.log(false || 'dog'); //dog
console.log(false || false); //두 번째 ν”Όμ—°μ‚°μž false

단좕 평가λ₯Ό μ‚¬μš©ν•˜λ©΄ if문을 λŒ€μ²΄ν•  수 μžˆλ‹€. 

//μ–΄λ–€ 쑰건이 Truthy κ°’ 일 λ•Œ 무언가λ₯Ό ν•΄μ•Ό ν•˜λŠ” 경우
var done = true;
var message = '';
//if쑰건문 ν™œμš©
if(done) message = 'μ™„λ£Œ';
console.log(message); //μ™„λ£Œ
//논리곱을 ν™œμš©
message = done && '성곡';
console.log(message); //성곡


//μ–΄λ–€ 쑰건이 falsy κ°’ 일 λ•Œ 무언가λ₯Ό ν•΄μ•Ό ν•˜λŠ” 경우
var done = false;
var message1 = '';
//if쑰건문 ν™œμš©
if(!done) message1 = 'μ™„λ£Œ';
console.log(message1); //μ™„λ£Œ
//논리곱을 ν™œμš©
message1 = done || '성곡';
console.log(message1); //성곡


//μ‚Όν•­ 쑰건 μ—°μ‚°μžμ˜ ν™œμš©
var done = true;
var message2 = '';

if(done) message2 = 'μ™„λ£Œ';
else message2 = 'λ―Έμ™„λ£Œ';
console.log(message2); //μ™„λ£Œ

message2 = done ? 'μ™„λ£Œ' : 'λ―Έμ™„λ£Œ'
console.log(message2) //μ™„λ£Œ

단좕 ν‰κ°€λŠ” λ˜ν•œ μ—¬λŸ¬ μƒν™©μ—μ„œ μœ μš©ν•˜κ²Œ μ‚¬μš©λœλ‹€.(μžμ„Έν•œ 사항은 ν›„μˆ )

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

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

 

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

  ES11μ—μ„œ λ„μž…λœ μ˜΅μ…”λ„ 체이닝 μ—°μ‚¬μž (?.)λŠ” μ’Œν•­μ˜ ν”Όμ—°μ‚°μžκ°€ null λ˜λŠ” undefined인 경우 undefinedλ₯Ό λ°˜ν™˜ν•˜κ³ , 그렇지 μ•ŠμœΌλ©΄ μš°ν•­μ˜ ν”„λ‘œνΌν‹° μ°Έμ‘°λ₯Ό 이어간닀. μ˜΅μ…”널 체이닝 μ—°μ‚°μžλŠ” 객체λ₯Ό 가리킀기λ₯Ό κΈ°λŒ€ν•˜λŠ” λ³€μˆ˜κ°€ null λ˜λŠ” undefinedκ°€ μ•„λ‹Œμ§€ ν™•μΈν•˜κ³  ν”„λ‘œνΌν‹°λ₯Ό μ°Έμ‘°ν•  λ•Œ μœ μš©ν•˜λ‹€. μ˜΅μ…”널 체이닝 μ—°μ‚°μžκ°€ λ„μž…λ˜κΈ° μ΄μ „μ—λŠ” λ…Όλ¦¬ μ—°μ‚°μž &&λ₯Ό μ‚¬μš©ν•œ 단좕 평가λ₯Ό 톡해 λ³€μˆ˜κ°€ null λ˜λŠ” undefined인지 ν™•μΈν–ˆμ—ˆλ‹€.

//논리곱 논리 μ—°μ‚°μžλ₯Ό μ‚¬μš©ν•΄μ„œ λ³€μˆ˜κ°€ null λ˜λŠ” undefinedκ°€ μ•„λ‹Œμ§€ ν™•μΈν•˜λŠ” 경우
var elem = null;
var value = elem && elem.vaule;
console.log(value);

//μ˜΅μ…”λ„ 체이닝 μ—°μ‚°μžλ₯Ό μ‚¬μš©ν•˜μ—¬ λ³€μˆ˜κ°€ null λ˜λŠ” undefinedκ°€ μ•„λ‹Œμ§€ ν™•μΈν•˜λŠ” 경우
var elem = null;
var value = elem ?. elem.value;
console.log(value);

μ˜΅μ…”λ„ 체이닝 μ—°μ‚°μžκ°€ λ“±μž₯ν•œ μ΄μœ λŠ” 논리곱 μ—°μ‚°μžλ₯Ό μ΄μš©ν•˜λŠ” 경우 μ’Œν•­μ˜ ν”Όμ—°μ‚°μžκ°€ Falsy κ°’(null, undefined, 0, -0, false, NaN, '')이면 μ’Œν•­ ν”Όμ—°μ‚°μžλ₯Ό κ·ΈλŒ€λ‘œ λ°˜ν™˜ν•œλ‹€. ν•˜μ§€λ§Œ 0μ΄λ‚˜ ''은 객체둜 평가될 λ•Œλ„ 있기 λ•Œλ¬Έμ— λ¬Έμ œκ°€ λ°œμƒν•  수 μžˆλ‹€.

 

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

  ES11μ—μ„œ λ„μž…λœ null 병합 μ—°μ‚°μž (??)λŠ” μ’Œν•­μ˜ ν”Όμ—°μ‚°μžκ°€ null λ˜λŠ” undefined인 경우 μš°ν•­μ˜ ν”Όμ—°μ‚¬μžλ₯Ό λ°˜ν™˜ν•˜κ³ , 그렇지 μ•ŠμœΌλ©΄ μ’Œν•­μ˜ ν”Όμ—°μ‚°μžλ₯Ό λ°˜ν™˜ν•œλ‹€. null 병합 μ—°μ‚°μžλŠ” λ³€μˆ˜μ— 기본값을 μ„€μ •ν•  λ•Œ μœ μš©ν•˜λ‹€. null 병합 μ—°μ‚°μžκ°€ λ„μž…λ˜κΈ° μ΄μ „μ—λŠ” λ…Όλ¦¬ μ—°μ‚°μž ||λ₯Ό μ‚¬μš©ν•œ 단좕 평가λ₯Ό 톡해 λ³€μˆ˜μ— 기본값을 μ„€μ •ν–ˆλ‹€.

//논리합 μ—°μ‚°μž ||λ₯Ό μ‚¬μš©ν•˜μ—¬ λ³€μˆ˜μ— 기본값을 μ„€μ •ν•˜λŠ” 방법
var foo = null || 'default string';
console.log(foo);

//null 병합 μ—°μ‚°μžλ₯Ό μ‚¬μš©ν•˜μ—¬ λ³€μˆ˜μ— 기본값을 μ„€μ •ν•˜λŠ” 방법
var foo = null ?? 'default string1';
console.log(foo);

null 병합 μ—°μ‚°μžκ°€ λ“±μž₯ν•œ μ΄μœ λŠ” 논리합 μ—°μ‚°μžλ₯Ό μ΄μš©ν•˜λŠ” 경우 μ’Œν•­μ˜ ν”Όμ—°μ‚°μžκ°€ Falsy κ°’(null, undefined, 0, -0, false, NaN, '')이면 μš°ν•­ ν”Όμ—°μ‚°μžλ₯Ό κ·ΈλŒ€λ‘œ λ°˜ν™˜ν•œλ‹€. ν•˜μ§€λ§Œ 0μ΄λ‚˜ ''도 κΈ°λ³Έκ°’μœΌλ‘œμ„œ μœ νš¨ν•˜λ‹€λ©΄ λ¬Έμ œκ°€ λ°œμƒν•  수 μžˆλ‹€.