ν‹°μŠ€ν† λ¦¬ λ·°

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

μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” κ°’μ˜ νƒ€μž…μ„ λ‹€λ₯Έ νƒ€μž…μœΌλ‘œ λ³€ν™˜ν•  수 μžˆλŠ”λ°, μ›μ‹œ 값은 λ³€κ²½ λΆˆκ°€λŠ₯ν•œ κ°’μž…λ‹ˆλ‹€. λ”°λΌμ„œ 사싀 값을 직접 λ³€κ²½ν•˜λŠ” 것은 μ•„λ‹ˆκ³  ν”Όμ—°μ‚°μžμ˜ 값을 μ•”λ¬΅μ μœΌλ‘œ νƒ€μž… λ³€ν™˜ν•΄ μƒˆλ‘œμš΄ νƒ€μž…μ˜ 값을 λ§Œλ“€μ–΄ μ‚¬μš©ν•˜κ³  λ²„λ¦½λ‹ˆλ‹€.

  • λͺ…μ‹œμ  νƒ€μž… λ³€ν™˜(νƒ€μž… μΊμŠ€νŒ…) : κ°œλ°œμžκ°€ μ˜λ„μ μœΌλ‘œ κ°’μ˜ νƒ€μž…μ„ λ³€ν™˜ μ‹œν‚΄
  • 암묡적 νƒ€μž… λ³€ν™˜(νƒ€μž… κ°•μ œ λ³€ν™˜) : μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진에 μ˜ν•΄ μ•”λ¬΅μ μœΌλ‘œ νƒ€μž…μ΄ μžλ™ λ³€ν™˜λ¨

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

개발자의 μ˜λ„μ™€λŠ” 상관없이 μ½”λ“œμ˜ λ¬Έλ§₯을 κ³ λ €ν•΄ μ•”λ¬΅μ μœΌλ‘œ 데이터 νƒ€μž…μ„ κ°•μ œ λ³€ν™˜μ‹œν‚€λŠ” 것을 μ˜λ―Έν•©λ‹ˆλ‹€.

μ½”λ“œ λ¬Έλ§₯에 λΆ€ν•©ν•˜μ§€ μ•ŠλŠ” μƒν™©μ—μ„œ 가급적 μ—λŸ¬λ₯Ό λ°œμƒμ‹œν‚€μ§€ μ•Šκ³  νƒ€μž…μ„ λ³€ν™˜μ‹œμΌœ ν‘œν˜„μ‹μ„ ν‰κ°€ν•˜κ²Œ λ©λ‹ˆλ‹€.

 

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

λ¬Έμžμ—΄ μ—°κ²° μ—°μ‚°μž +λ₯Ό 톡해 λ¬Έμžμ—΄κ³Ό ν•¨κ»˜ λ“€μ–΄μ˜¨ ν”Όμ—°μ‚°μžλ₯Ό λ¬Έμžμ—΄ νƒ€μž…μœΌλ‘œ 암묡적 νƒ€μž… λ³€ν™˜μ„ μ§„ν–‰ν•©λ‹ˆλ‹€.

// 암묡적 λ¬Έμžμ—΄ νƒ€μž… λ³€ν™˜μ˜ μ˜ˆμ‹œλ“€

1 + '2'; // "12"
true + ''; // "true"
null + ''; // "null"
undefined + ''; // "undefined"
(Symbol()) + ''; // TypeError : μ‹¬λ²Œμ€ string으둜 λ³€ν™˜μ΄ λΆˆκ°€λŠ₯!
({}) + ''; // "[object,object]"
Math + ''; // "[object Math]"
[] + ''; // ""
[10,20] + ''; // "10,20"
(function(){}) + ''; // "function(){}"
Array + ''; // "function Array() { [native code] }"

 

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

μ‚°μˆ  μ—°μ‚°μž(*, /, -)의 역할은 숫자 값을 λ§Œλ“œλŠ” κ²ƒμž…λ‹ˆλ‹€. λ”°λΌμ„œ μ‚°μˆ  μ—°μ‚°μžμ˜ λͺ¨λ“  ν”Όμ—°μ‚°μžλŠ” μ½”λ“œ 문백상 λͺ¨λ‘ 숫자 νƒ€μž…μœΌλ‘œ λ³€ν™˜λ©λ‹ˆλ‹€.

// 암묡적 숫자 νƒ€μž… λ³€ν™˜μ˜ μ˜ˆμ‹œλ“€

1 - '2'; // -1
1 * '10'; // 10
1 / 'one'; // NaN

// 비ꡐλ₯Ό μœ„ν•΄ 숫자 νƒ€μž…μœΌλ‘œ λ³€ν™˜
'1' > 0 // true

// 단항 μ—°μ‚°μžλŠ” ν”Όμ—°μ‚°μžκ°’μ΄ 숫자 νƒ€μž…μ΄μ–΄μ•Όν•¨
+''; // 0
+'0'; // 0
+'1'; // 1
+'string'; // NaN
+true; // 1
+null; // 0
+undefined; // NaN

//μ‹¬λ²Œ νƒ€μž…μ€ 숫자둜 λ³€ν™˜ λΆˆκ°€λŠ₯
+Symbol(); // TypeError

// 객체 νƒ€μž…
+{}; // NaN
+[]; // 0
+[10,20]; // NaN

 

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

μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진은 μ‘°κ±΄μ‹μ˜ 평가 κ²°κ³Όλ₯Ό λΆˆλ¦¬μ–Έ νƒ€μž…μœΌλ‘œ 암묡적 νƒ€μž… λ³€ν™˜μ„ μ§„ν–‰ν•©λ‹ˆλ‹€. μ΄λ•Œ, λΆˆλ¦¬μ–Έ νƒ€μž…μ΄ μ•„λ‹Œ 값을 Truthyκ°’κ³Ό Falsyκ°’μœΌλ‘œ κ΅¬λΆ„ν•œ ν›„ 각각 true 와 false둜 νƒ€μž…μ„ λ³€ν™˜ν•©λ‹ˆλ‹€.

Falsyκ°’μ˜ μ’…λ₯˜λŠ” false, undefined, null, 0, -0, NaN, ''(빈 λ¬Έμžμ—΄) μœΌλ‘œ κ΅¬μ„±λ˜λ©° 이듀을 μ œμ™Έν•œ λͺ¨λ“  값은 Truthyκ°’μž…μœΌλ‘œ ν‰κ°€λ©λ‹ˆλ‹€.

 

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

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

  • *ν‘œμ€€ 빌트인 μƒμ„±μž ν•¨μˆ˜(String, Number, Boolean)λ₯Ό new μ—°μ‚°μž 없이 호좜
  • *ν‘œμ€€ 빌트인 λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜λŠ” 방법
  • 암묡적 νƒ€μž… λ³€ν™˜μ„ μ΄μš©ν•˜λŠ” 방법

*ν‘œμ€€ 빌트인 : μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ κΈ°λ³Έ μ œκ³΅ν•˜λŠ” ν•¨μˆ˜

 

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

 

  • String μƒμ„±μž ν•¨μˆ˜λ₯Ό new μ—°μ‚°μž 없이 호좜
String(1); // "1"
String(NaN); // "NaN"
String(true); // "true"

 

  • Object.protorype.toString λ©”μ„œλ“œλ₯Ό μ‚¬μš©
(1).toString(); // "1"
(NaN).toString(); // "NaN"
(true).toString(); // "true"

 

  • λ¬Έμžμ—΄ μ—°κ²° μ—°μ‚°μžλ₯Ό 이용
1 + ''; // "1"
true + ''; // true

 

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

 

  • Number μƒμ„±μž ν•¨μˆ˜λ₯Ό new μ—°μ‚°μž 없이 호좜
Number('0'); // 0
Number('-10.5'); // -10.5
Number(true); // 1

 

  • parseInt, parseFloat λ©”μ„œλ“œλ₯Ό μ‚¬μš©
parseInt('0'); // 0

parseFloat('10.5'); // 10.5

 

  • + 단항 μ‚°μˆ  μ—°μ‚°μžλ₯Ό 이용
+'0'; // 0

 

  • * μ‚°μˆ  μ—°μ‚°μžλ₯Ό 이용
'0' * 1; // 0
true * 1; // 1

 

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

 

  • Boolean μƒμ„±μž ν•¨μˆ˜λ₯Ό new μ—°μ‚°μž 없이 호좜
Boolean('x'); // true
Boolean(''); // false
Boolean(0); // false
Boolean(Infinity); // true
Boolean(NaN); // false

 

  • ! λΆ€μ • 논리 μ—°μ‚°μžλ₯Ό 두 번 μ‚¬μš©ν•˜λŠ” 방법
!!'x'; // true
!!'flase' // false
!!0; // false

 

단좕 평가

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

 

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

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

단좕 평가 ν‘œν˜„μ‹ 평가 κ²°κ³Ό
true || anything true
false || anything anything
true && anything anything
false && anything false

단좕 평가λ₯Ό μ΄μš©ν•˜λ©΄ μœ μš©ν•œ κ²½μš°λŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

 

  • 객체λ₯Ό 가리킀기λ₯Ό κΈ°λŒ€ν•˜λŠ” λ³€μˆ˜κ°€ null λ˜λŠ” undefinedκ°€ μ•„λ‹Œμ§€ ν™•μΈν•˜κ³  ν”„λ‘œνΌν‹°λ₯Ό μ°Έμ‘°ν•  λ•Œ
var elem = null;
var value = elem && elem.value; // null

 

  • ν•¨μˆ˜ λ§€κ°œλ³€μˆ˜μ— 기본값을 μ„€μ •ν•  λ•Œ
function getStringLen(str) {
   str = str || '';
   return str.length;
}

getStringLen(); // 0
getStringLen('a'); // 1

 

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

?. λŠ” μ’Œν•­μ˜ ν”Όμ—°μ‚°μžκ°€ null λ˜λŠ” undefined인 경우 undefinedλ₯Ό λ°˜ν™˜ν•˜κ³ , 그렇지 μ•ŠμœΌλ©΄ μš°ν•­μ˜ ν”„λ‘œνΌν‹°λ₯Ό μ°Έμ‘°λ₯Ό μ΄μ–΄κ°’λ‹ˆλ‹€.

var elem = null;
var valuve = elem?.value;

console.log(value); // undefined

// 0μ΄λ‚˜ ''λŠ” 객체둜 평가될 λ•Œλ„ μžˆμ–΄μ„œ ?.λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.
var str = '';
var len = str?.length;

console.log(len); // 0

 

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

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

var foo = null ?? 'string';
console.log(foo); // "string"

// Falsy 값인 0μ΄λ‚˜ ''도 κΈ°λ³Έκ°’μœΌλ‘œμ„œ μœ νš¨ν•˜λ‹€λ©΄ 예기치 μ•Šμ€ λ™μž‘μ΄ λ°œμƒν•  μˆ˜λ„ μžˆμ–΄ null 병합 μ—°μ‚°μžλ₯Ό μ΄μš©ν•©λ‹ˆλ‹€.
var foo = '' ?? 'string';
console.log(foo); // "string"

 

 

 

 

[좜처] λͺ¨λ˜ μžλ°”μŠ€ν¬λ¦½νŠΈ Deep Dive

https://wikibook.co.kr/mjs/

 

λͺ¨λ˜ μžλ°”μŠ€ν¬λ¦½νŠΈ Deep Dive: μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ κΈ°λ³Έ κ°œλ…κ³Ό λ™μž‘ 원리

269개의 κ·Έλ¦Όκ³Ό 원리λ₯Ό νŒŒν—€μΉ˜λŠ” μ„€λͺ…μœΌλ‘œ ‘μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ κΈ°λ³Έ κ°œλ…κ³Ό λ™μž‘ 원리’λ₯Ό μ΄ν•΄ν•˜μž! μ›ΉνŽ˜μ΄μ§€μ˜ λ‹¨μˆœν•œ 보쑰 κΈ°λŠ₯을 μ²˜λ¦¬ν•˜κΈ° μœ„ν•œ μ œν•œμ μΈ μš©λ„λ‘œ νƒœμ–΄λ‚œ μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” 과도

wikibook.co.kr