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

μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ λͺ¨λ“  값은 νƒ€μž…μ΄ μžˆλ‹€. κ°’μ˜ νƒ€μž…μ€ 개발자의 μ˜λ„μ— 따라 λ‹€λ₯Έ νƒ€μž…μœΌλ‘œ λ³€ν™˜ν•  수 μžˆλ‹€. κ°œλ°œμžκ°€ μ˜λ„μ μœΌλ‘œ κ°’μ˜ νƒ€μž…μ„ λ³€ν™˜ν•˜λŠ”κ²ƒμ„ λͺ…μ‹œμ  νƒ€μž… λ³€ν™˜ λ˜λŠ” νƒ€μž… μΊμŠ€νŒ…μ΄λΌκ³  ν•œλ‹€. 반면 개발자의 μ˜λ„μ™€λŠ” 상관없이 ν‘œν˜„μ‹μ„ ν‰κ°€ν•˜λŠ” 도쀑에 μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진에 μ˜ν•΄ μ•”λ¬΅μ μœΌλ‘œ νƒ€μž…μ΄ μžλ™λ³€ν™˜λ˜κΈ°λ„ ν•˜λŠ”λ° 이λ₯Ό 암묡적 νƒ€μž… λ³€ν™˜ λ˜λŠ” νƒ€μž… κ°•μ œ λ³€ν™˜μ΄λΌ ν•œλ‹€.

μ›μ‹œ κ°’μ΄λž€ λ³€κ²½ λΆˆκ°€λŠ₯ν•œ κ°’μ΄λ―€λ‘œ λͺ…μ‹œμ  νƒ€μž… λ³€ν™˜μ΄λ‚˜ 암묡적 νƒ€μž…λ³€ν™˜μ— μ˜ν•΄ λ³€κ²½λ˜μ§€ μ•ŠλŠ”λ‹€. νƒ€μž… λ³€ν™˜μ΄λž€ κΈ°μ‘΄ μ›μ‹œ 값을 μ‚¬μš©ν•΄ λ‹€λ₯Έ νƒ€μž…μ˜ μƒˆλ‘œμš΄ μ›μ‹œ 값을 μƒμ„±ν•˜λŠ”κ²ƒμ΄λ‹€.


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

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

  // 숫자 νƒ€μž…
  0 + ''              // "0"
  -0 + ''             // "0"
  1+ ''               // "1"
  -1 + ''             // "-1"
  NaN + ''            // "NaN"
  Infinity + ''       // "Infinity"
  -Infinity + ''      // "-Infinity"

  // λΆ€μšΈλ¦¬μ–Έ νƒ€μž…
  true + ''           // "true"
  false + ''          // "false"

  // null νƒ€μž…
  null + ''           // "null"

  // undefined νƒ€μž…
  undefined + ''      // "undefined"

  // μ‹¬λ²Œ νƒ€μž…
  (Symbol()) + ''     // "TypeError"

  // 객체 νƒ€μž…
  ({}) + ''           // "[object Object]"
  Math + ''           // "[object Math]"
  [] + ''             // ""
  [10, 20] + ''       // "10, 20"
  (function(){}) + '' // "function()"
  Array + ''          // "function Array() {[native code]}"

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

  // 숫자 νƒ€μž…
  +''               // 0
  +'0'              // 0
  +'1'              // 1 
  +'string'         //  NaN

  // λΆ€μšΈλ¦¬μ–Έ νƒ€μž…
  +true             //  1
  +false            //  0

  // null νƒ€μž…
  +null             //  0

  // undefined νƒ€μž…
  +undefined        //  NaN

  // μ‹¬λ²Œ νƒ€μž…
  +Symbol()         //  TypeError

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

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

μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진은 λΆ€μšΈλ¦¬μ–Έ νƒ€μž…μ΄ μ•„λ‹Œ 값을 Truthy κ°’ λ˜λŠ” Falsy κ°’μœΌλ‘œ ꡬ뢄해 각각 true와 false둜 암묡적 νƒ€μž… λ³€ν™˜ ν•œλ‹€. λ‹€μŒμ€ false둜 ν‰κ°€λ˜λŠ” Falsy 값이닀. Falsy와 Truthy κ°’ μ•žμ— λŠλ‚Œν‘œ(!)λ₯Ό λΆ™μ–΄μ£Όλ©΄ 각각 true와 false둜 μ „λ‹¬λœλ‹€.

  • false
  • undefined
  • null
  • 0, -0
  • NaN
  • β€˜β€™(빈 λ¬Έμžμ—΄)

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

개발자의 μ˜λ„μ— 따라 λͺ…μ‹œμ μœΌλ‘œ νƒ€μž…μ„ λ³€κ²½ν•˜λŠ” 방법은 ν‘œμ€€ 빌트인 μƒμ„±μž ν•¨μˆ˜λ₯Ό new μ—°μ‚°μž 없이 ν˜ΈμΆœν•˜λŠ” 방법, 빌트인 λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜λŠ” 방법, 암묡적 νƒ€μž… λ³€ν™˜ 방법이 μžˆλ‹€.

🧐 ν‘œμ€€ 빌트인 μƒμ„±μž ν•¨μˆ˜μ™€ 빌트인 λ©”μ„œλ“œ

ν‘œμ€€ 빌트인 μƒμ„±μž ν•¨μˆ˜μ™€ ν‘œμ€€ 빌트인 λ©”μ„œλ“œλŠ” μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ κΈ°λ³Έ μ œκ³΅ν•˜λŠ” ν•¨μˆ˜λ‹€. ν‘œμ€€ 빌트인 μƒμ„±μž ν•¨μˆ˜λŠ” 객체λ₯Ό μƒμ„±ν•˜κΈ° μœ„ν•œ ν•¨μˆ˜μ΄λ©° new μ—°μ‚°μžμ™€ ν•¨κ»˜ ν˜ΈμΆœν•œλ‹€. ν‘œμ€€ 빌트인 λ©”μ„œλ“œλŠ” μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ κΈ°λ³Έ μ œκ³΅ν•˜λŠ” 빌트인 객체의 λ©”μ„œλ“œλ‹€.

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

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

    // 숫자 νƒ€μž… => λ¬Έμžμ—΄ νƒ€μž…
    String(1);              // "1"
    String(NaN);            // "NaN"
    String(Infinity);       // "Infinity"
    
    // λΆ€μšΈλ¦¬μ–Έ νƒ€μž… => λ¬Έμžμ—΄ νƒ€μž…
    String(true)            // "true"
    String(false)           // "false"
  • Object.prototype.toString λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜λŠ” 방법

    // 숫자 νƒ€μž… => λ¬Έμžμ—΄ νƒ€μž…
    (1).toString();         // "1"
    (NaN).toString();       // "NaN"
    (Infinity)toString();   // "Infinity"
    
    // λΆ€μšΈλ¦¬μ–Έ νƒ€μž… => λ¬Έμžμ—΄ νƒ€μž…
    (true).toString();      // "true"
    (false).toString();     // "false"
  • λ¬Έμžμ—΄ μ—°κ²° μ—°μ‚°μžλ₯Ό μ΄μš©ν•˜λŠ” 방법

      // 숫자 νƒ€μž… => λ¬Έμžμ—΄ νƒ€μž…
      1 + ''                  // "1"
      NaN + ''                //  "NaN"
      Infinity + ''           // "Infinity"
    
      // λΆ€μšΈλ¦¬μ–Έ νƒ€μž… => λ¬Έμžμ—΄ νƒ€μž…
      true + ''               // "true"
      false + ''              // "false"

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

  • Number μƒμ„±μž ν•¨μˆ˜λ₯Ό new μ—°μ‚°μž 없이 ν˜ΈμΆœν•˜λŠ” 방법
      // λ¬Έμžμ—΄ νƒ€μž… => 숫자 νƒ€μž…
      Number('0');     // -> 0
      Number('-1');    // -> -1
      Number('10.53'); // -> 10.53
      // λΆˆλ¦¬μ–Έ νƒ€μž… => 숫자 νƒ€μž…
      Number(true);    // -> 1
      Number(false);   // -> 0
  • parseInt, parseFloatν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜λŠ” 방법(λ¬Έμžμ—΄λ§Œ 숫자 νƒ€μž…μœΌλ‘œ λ³€ν™˜ κ°€λŠ₯)
      parseInt('0');       // -> 0
      parseInt('-1');      // -> -1
      parseFloat('10.53'); // -> 10.53
  • + 단항 μ‚°μˆ  μ—°μ‚°μžλ₯Ό μ΄μš©ν•˜λŠ” 방법
      // λ¬Έμžμ—΄ νƒ€μž… => 숫자 νƒ€μž…
      +'0';     // -> 0
      +'-1';    // -> -1
      +'10.53'; // -> 10.53
      // λΆˆλ¦¬μ–Έ νƒ€μž… => 숫자 νƒ€μž…
      +true;    // -> 1
      +false;   // -> 0
  • * μ‚°μˆ  μ—°μ‚°μžλ₯Ό μ΄μš©ν•˜λŠ” 방법
      // λ¬Έμžμ—΄ νƒ€μž… => 숫자 νƒ€μž…
      '0' * 1;     // -> 0
      '-1' * 1;    // -> -1
      '10.53' * 1; // -> 10.53
      // λΆˆλ¦¬μ–Έ νƒ€μž… => 숫자 νƒ€μž…
      true * 1;    // -> 1
      false * 1;   // -> 0

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

  • Boolean μƒμ„±μž ν•¨μˆ˜λ₯Ό new μ—°μ‚°μž 없이 ν˜ΈμΆœν•˜λŠ” 방법
      // λ¬Έμžμ—΄ νƒ€μž… => λΆˆλ¦¬μ–Έ νƒ€μž…
      Boolean('x');       // -> true
      Boolean('');        // -> false
      Boolean('false');   // -> true
      // 숫자 νƒ€μž… => λΆˆλ¦¬μ–Έ νƒ€μž…
      Boolean(0);         // -> false
      Boolean(1);         // -> true
      Boolean(NaN);       // -> false
      Boolean(Infinity);  // -> true
      // null νƒ€μž… => λΆˆλ¦¬μ–Έ νƒ€μž…
      Boolean(null);      // -> false
      // undefined νƒ€μž… => λΆˆλ¦¬μ–Έ νƒ€μž…
      Boolean(undefined); // -> false
      // 객체 νƒ€μž… => λΆˆλ¦¬μ–Έ νƒ€μž…
      Boolean({});        // -> true
      Boolean([]);        // -> true
  • ! λΆ€μ • 논리 μ—°μ‚°μžλ₯Ό 두 번 μ‚¬μš©ν•˜λŠ” 방법
      // λ¬Έμžμ—΄ νƒ€μž… => λΆˆλ¦¬μ–Έ νƒ€μž…
      !!'x';       // -> true
      !!'';        // -> false
      !!'false';   // -> true
      // 숫자 νƒ€μž… => λΆˆλ¦¬μ–Έ νƒ€μž…
      !!0;         // -> false
      !!1;         // -> true
      !!NaN;       // -> false
      !!Infinity;  // -> true
      // null νƒ€μž… => λΆˆλ¦¬μ–Έ νƒ€μž…
      !!null;      // -> false
      // undefined νƒ€μž… => λΆˆλ¦¬μ–Έ νƒ€μž…
      !!undefined; // -> false
      // 객체 νƒ€μž… => λΆˆλ¦¬μ–Έ νƒ€μž…
      !!{};        // -> true
      !![];        // -> true

9.4 단좕 평가

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

논리곱(&&) μ—°μ‚°μžλŠ” 두 개의 ν”Όμ—°μ‚°μžκ°€ λͺ¨λ‘ true둜 평가될 λ•Œ trueλ₯Ό λ°˜ν™˜ν•œλ‹€. 논리곱 μ—°μ‚°μžλŠ” μ’Œν•­μ—μ„œ μš°ν•­μœΌλ‘œ 평가가 μ§„ν–‰λœλ‹€. 논리곱 μ—°μ‚°μžλŠ” 논리 μ—°μ‚°μ˜ κ²°κ³Όλ₯Ό κ²°μ •ν•˜λŠ” 두 번째 ν”Όμ—°μ‚°μž, 즉 λ¬Έμžμ—΄ β€˜Dog’λ₯Ό κ·ΈλŒ€λ‘œ λ°˜ν™˜ν•œλ‹€.

논리합(||) μ—°μ‚°μžλŠ” 두 개의 ν”Όμ—°μ‚°μž 쀑 ν•˜λ‚˜λ§Œ true둜 평가 λ˜μ–΄λ„ trueλ₯Ό λ°˜ν™˜ν•œλ‹€. 논리합 μ—°μ‚°μžλ„ μ’Œν•­μ—μ„œ μš°ν•­μœΌλ‘œ 평가가 μ§„ν–‰λœλ‹€. 논리합 μ—°μ‚°μžλŠ” κ²°κ³Όλ₯Ό κ²°μ •ν•œ 첫 번째 ν”Όμ—°μ‚°μž, 즉 λ¬Έμžμ—΄ β€˜Cat’ 을 κ·ΈλŒ€λ‘œ λ°˜ν™˜ν•œλ‹€.

논리곱 μ—°μ‚°μžμ™€ 논리합 μ—°μ‚°μžλŠ” 이처럼 논리 μ—°μ‚°μ˜ κ²°κ³Όλ₯Ό κ²°μ •ν•˜λŠ” ν”Όμ—°μ‚°μžλ₯Ό νƒ€μž… λ³€ν™˜ν•˜μ§€ μ•Šκ³  κ·ΈλŒ€λ‘œ λ°˜ν™˜ν•œλ‹€. 이λ₯Ό 단좕 평가라고 ν•œλ‹€. 단좕 ν‰κ°€λŠ” ν‘œν˜„μ‹μ„ ν‰κ°€ν•˜λŠ” 도쀑에 평가결과가 ν™•μ •λœ 경우 λ‚˜λ¨Έμ§€ 평가 과정을 μƒλž΅ν•˜λŠ” 것을 λ§ν•œλ‹€. 단좕평가λ₯Ό μ‚¬μš©ν•˜λ©΄ if 문을 λŒ€μ²΄ν•  수 있으며, μ‚Όν•­ 쑰건 μ—°μ‚°μžλŠ” if-else 문을 λŒ€μ²΄ν•  수 μžˆλ‹€.

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

  var done = true;
  var message = '';

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

  // if...else 문은 μ‚Όν•­ 쑰건 μ—°μ‚°μžλ‘œ λŒ€μ²΄ κ°€λŠ₯ν•˜λ‹€.
  message = done ? 'μ™„λ£Œ' : 'λ―Έμ™„λ£Œ';
  console.log(message); // μ™„λ£Œ

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

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

  var elem = null;

  // elem이 null λ˜λŠ” undefined이면 undefinedλ₯Ό λ°˜ν™˜ν•˜κ³ , 그렇지 μ•ŠμœΌλ©΄ μš°ν•­μ˜ ν”„λ‘œνΌν‹° μ°Έμ‘°λ₯Ό 이어간닀.
  var value = elem?.value;
  console.log(value);        // undefined

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

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

  // μ’Œν•­μ˜ ν”Όμ—°μ‚°μžκ°€ null λ˜λŠ” undefined이면 μš°ν•­μ˜ ν”Όμ—°μ‚°μžλ₯Ό λ°˜ν™˜ν•˜κ³ , 
  // 그렇지 μ•ŠμœΌλ©΄ μ’Œν•­μ˜ ν”Όμ—°μ‚°μžλ₯Ό λ°˜ν™˜ν•œλ‹€.

  var foo = null ?? 'default string'
  console.log(foo);        // "default string"
profile
μ΄μ‚¬μ€‘μž…λ‹ˆλ‹€!🌟https://velog.io/@devkyoung2

0개의 λŒ“κΈ€

κ΄€λ ¨ μ±„μš© 정보