Skip to content

Latest commit

Β 

History

History
244 lines (211 loc) Β· 13 KB

type-conversion.md

File metadata and controls

244 lines (211 loc) Β· 13 KB

이번 μž₯μ—μ„œ νƒ€μž… λ³€ν™˜μ— λŒ€ν•΄ μžμ„Ένžˆ λ‹€λ£Ήλ‹ˆλ‹€. μ’…λ₯˜μ™€ κ·Έ λ‚΄μš©κΉŒμ§€ 말이죠.

νƒ€μž… λ³€ν™˜(Type Conversion)

μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ λͺ¨λ“  값은 νƒ€μž…μ΄ μ‘΄μž¬ν•˜λ©°, 이λ₯Ό λ³€ν™˜ν•˜λŠ” λ°©λ²•μ—λŠ” κ°œλ°œμžμ— μ˜ν•΄ λ³€ν™˜λ˜λŠ” 방법과 개발자의 μ˜λ„μ™€ 상관 없이 λ³€ν™˜λ˜λŠ” 방법이 μžˆμŠ΅λ‹ˆλ‹€.

  • νƒ€μž… μΊμŠ€νŒ…(Type Casting, λ˜λŠ” λͺ…μ‹œμ  νƒ€μž… λ³€ν™˜(Explicit Coercion)) : κ°œλ°œμžκ°€ μ˜λ„μ μœΌλ‘œ κ°’μ˜ νƒ€μž…μ„ λ°”κΎΈλŠ” λ°©λ²•μž…λ‹ˆλ‹€.

    let a = 10;
    let b = a.toString();     // μ—¬κΈ°μ„œ νƒ€μž… μΊμŠ€νŒ…μ΄ μΌμ–΄λ‚©λ‹ˆλ‹€.
    console.log(typeof b, b); // 'string', '10'
    console.log(typeof a, a); // 'number', 10
  • νƒ€μž… κ°•μ œ λ³€ν™˜(Type Coercion, λ˜λŠ” 암묡적 νƒ€μž… λ³€ν™˜(Implicit Coercion)) : μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진에 μ˜ν•΄ μ•”λ¬΅μ μœΌλ‘œ νƒ€μž…μ΄ μžλ™ λ³€ν™˜λ˜λŠ” λ°©λ²•μž…λ‹ˆλ‹€.

    let a = 10;
    let b = a + '';
    console.log(typeof b, b); // 'string', '10'
    console.log(typeof a, a); // 'number', 10

μœ„μ˜ λͺ¨λ“  νƒ€μž… λ³€ν™˜μ΄ 기쑴의 μ›μ‹œ 값을 λ³€κ²½ν•˜λŠ” 것은 μ•„λ‹™λ‹ˆλ‹€! μ›μ‹œ 값은 λΆˆλ³€μ΄λ―€λ‘œ λ³€ν•˜μ§€ μ•ŠμœΌλ‹ˆκΉŒμš”. μœ„μ˜ 예제λ₯Ό λ‹€μ‹œ λ³ΌκΉŒμš”?

let a = 10;               // 1번
let b = a + '';           // 2번
  • 1번 : 숫자 10의 값을 λ©”λͺ¨λ¦¬μ— μ €μž₯ν•˜κ³ , aλΌλŠ” λ³€μˆ˜κ°€ 가리킀도둝 ν•©λ‹ˆλ‹€.
  • 2번 : μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진은 a λ³€μˆ˜μ˜ 숫자 값을 λ°”νƒ•μœΌλ‘œ μƒˆλ‘œμš΄ λ¬Έμžμ—΄ '10'을 μƒμ„±ν•˜κ³ , ν‘œν˜„μ‹ '10' + ''λ₯Ό ν‰κ°€ν•©λ‹ˆλ‹€.
    • 이 λ•Œ μ•”λ¬΅μ μœΌλ‘œ μƒμ„±λœ λ¬Έμžμ—΄ '10'을 a λ³€μˆ˜μ— μž¬ν• λ‹Ήν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

이처럼 μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진은 ν‘œν˜„μ‹μ„ μ—λŸ¬ 없이 ν‰κ°€ν•˜κΈ° μœ„ν•΄ μ•„λž˜μ™€ 같이 μ—°μ‚°ν•©λ‹ˆλ‹€.

  1. ν”Όμ—°μ‚°μžμ˜ 값을 μ•”λ¬΅μ μœΌλ‘œ νƒ€μž… λ³€ν™˜ν•˜μ—¬ μƒˆλ‘œμš΄ νƒ€μž…μ˜ κ°’ 생성
  2. 단 ν•œ 번 μ‚¬μš©ν•˜κ³  버림

λͺ…μ‹œμ  νƒ€μž… λ³€ν™˜μ΄ κ°œλ°œμžμ— μ˜ν•΄ λͺ…ν™•νžˆ μ•Œ 수 μžˆμŠ΅λ‹ˆλ‹€. 그에 λ°˜ν•΄ 암묡적 νƒ€μž… λ³€ν™˜μ€ μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진에 μ˜ν•΄ μžλ™ λ³€κ²½λ˜λ―€λ‘œ 개발자의 예츑, 즉 κ²½ν—˜μ„ μš”κ΅¬ν•˜κ²Œ λ©λ‹ˆλ‹€. μ€‘μš”ν•œ 것은, νƒ€μž… λ³€ν™˜μ˜ μ’…λ₯˜κ°€ μ•„λ‹ˆλΌ κ°œλ°œμžμ™€μ˜ ν˜‘μ—…μ—μ„œ μ–΄λ–€ νƒ€μž… λ³€ν™˜μ„ μ‚¬μš©ν•΄μ•Ό 가독성과 이해λ₯Ό 높일 수 μžˆλŠλƒ μž…λ‹ˆλ‹€.

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

μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진에 μ˜ν•΄ μžλ™μœΌλ‘œ λ³€ν™˜λ˜λŠ” λ°©λ²•μž…λ‹ˆλ‹€. λ¬Έμžμ—΄, 숫자, λΆˆλ¦¬μ–Έ νƒ€μž… λ³€ν™˜μ΄ μ‘΄μž¬ν•΄μš”.

  1. λ¬Έμžμ—΄ νƒ€μž… λ³€ν™˜ : (+)μ—°μ‚°μžλŠ” ν”Όμ—°μ‚°μž 쀑 ν•˜λ‚˜ 이상이 λ¬Έμžμ—΄μ΄λ―€λ‘œ λ¬Έμžμ—΄ μ—°κ²° μ—°μ‚°μžλ‘œ λ™μž‘ν•©λ‹ˆλ‹€.
  • 단, ES6의 ν…œν”Œλ¦Ώ λ¦¬ν„°λŸ΄μ€ ν‰κ°€μ˜ κ²°κ³Όλ₯Ό λ¬Έμžμ—΄λ‘œ ν‘œν˜„ν•©λ‹ˆλ‹€.

    let a = '10' + 2; // '102'
    let b = `10 + 2 = ${10 + 2}`;  // '10 + 2 = 12'
  • 더 λ§Žμ€ 예제λ₯Ό λ³ΌκΉŒμš”?

    ν‘œν˜„μ‹ κ²°κ³Ό
    console.log(0 + ''); '0'
    console.log(-0 + ''); '0'
    console.log(1 + ''); '1'
    console.log(-1 + ''); '-1'
    console.log(NaN + ''); 'NaN'
    console.log(Infinity + ''); 'Infinity'
    console.log(-Infinity + ''); '-Infinity'
    console.log(true + ''); 'true'
    console.log(false + ''); 'false'
    console.log(null + ''); 'null'
    console.log(undefined + ''); 'undefined'
    console.log((Symbol()) + ''); TypeError: Cannot convert a Symbol value to a string
    console.log(({}) + ''); '[object Object]'
    console.log(Math + ''); '[object Math]'
    console.log([] + ''); ''
    console.log([10, 20] + ''); '10,20'
    console.log((function(){}) + ''); 'function(){}'
    console.log(Array + ''); 'function Array() { [native code] }'

  1. 숫자 νƒ€μž… λ³€ν™˜ : (-, *, /)λŠ” λͺ¨λ‘ μ‚°μˆ  μ—°μ‚°μžλ‘œ, 숫자 값을 λ§Œλ“œλŠ” 역할이며 λͺ¨λ“  ν”Όμ—°μ‚°μžλŠ” λ¬Έλ§₯상 λͺ¨λ‘ 숫자 νƒ€μž…μœΌλ‘œ λ³€ν™˜λ©λ‹ˆλ‹€.
  • 단, 비ꡐ μ—°μ‚°μž (>, <, >=, <=, ==)λŠ” ν”Όμ—°μ‚°μžμ˜ 크기λ₯Ό λΉ„κ΅ν•˜λ―€λ‘œ λ™μΌν•˜κ²Œ 숫자 νƒ€μž… λ³€ν™˜μ΄ λ°œμƒν•©λ‹ˆλ‹€.

    let a = '1' > 0;  // true
    let b = '0' == 0; // true
  • 더 λ§Žμ€ 예제λ₯Ό λ³ΌκΉŒμš”?

    ν‘œν˜„μ‹ κ²°κ³Ό
    console.log(+''); 0
    console.log(+'0'); 0
    console.log(+'1'); 1
    console.log(+'string'); NaN
    console.log(+true); 1
    console.log(+false); 0
    console.log(+null); 0
    console.log(+undefined); NaN
    console.log(+Symbol()); TypeError: Cannot convert a Symbol value to a number
    console.log(+{}); NaN
    console.log(+[]); 0
    console.log(+[10, 20]); NaN
    console.log(+(function(){})); NaN
  1. λΆˆλ¦¬μ–Έ νƒ€μž… λ³€ν™˜ : μ œμ–΄λ¬Έ, μ‚Όν•­ 쑰건 μ—°μ‚°μžλŠ” λ…Όλ¦¬μ μœΌλ‘œ ν‰κ°€λ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€. λͺ¨λ“  ν”Όμ—°μ‚°μžλŠ” λͺ¨λ‘ λΆˆλ¦¬μ–Έ νƒ€μž…μœΌλ‘œ λ³€ν™˜λ©λ‹ˆλ‹€.
  • νŠΉμ΄ν•˜κ²Œλ„ μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진은 λΆˆλ¦¬μ–Έ νƒ€μž…μ΄ μ•„λ‹Œ 값을 Truthy Value(참으둜 ν‰κ°€λ˜λŠ” κ°’), Falsy Value(κ±°μ§“μœΌλ‘œ ν‰κ°€λ˜λŠ” κ°’)으둜 κ΅¬λΆ„ν•©λ‹ˆλ‹€. Falsy Value의 μ’…λ₯˜λŠ” μ•„λž˜μ™€ κ°™μœΌλ©°, Falsy Valueκ°€ μ•„λ‹Œ λͺ¨λ“  값듀은 Truthy Valueμž…λ‹ˆλ‹€.

    • false
    • undefined
    • null
    • 0, -0
    • NaN
    • ''(empty string)
  • 더 λ§Žμ€ 예제λ₯Ό λ³ΌκΉŒμš”?

    ν‘œν˜„μ‹ κ²°κ³Ό
    if ('') {} true
    if (true) {} true
    if (0) {} false
    if ('str') {} true
    if (null) {} false
    if (!false) {} true
    if (!undefined) {} true
    if (!null) {} true
    if (!0) {} true
    if (!NaN) {} true
    if (!'') {} true
  • μΆ”κ°€μ μœΌλ‘œ, Falsy Value와 Truthy Valueλ₯Ό λ°˜ν™˜ν•˜λŠ” ν˜•νƒœλŠ” μ•„λž˜μ™€ κ°™μŠ΅λ‹ˆλ‹€.

    if(!target) {}   // target이 Falsy Value면 true, Truthy Value면 false
    if(!!value) {}   // target이 Truthy Value면 true, Falsy Value면 false

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

개발자의 μ˜λ„μ— 따라 κ°•μ œμ μœΌλ‘œ λ³€ν™˜ν•˜λŠ” λ°©λ²•μž…λ‹ˆλ‹€. ν‘œμ€€ 빌트인 μƒμ„±μž ν•¨μˆ˜, λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ λ³€ν™˜ν•©λ‹ˆλ‹€.

μƒμ†Œν•œ 단어가 λ‚˜μ™”μ£ ? 빌트인(built-in)μ΄λž€ μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ 기본적으둜 μ œκ³΅ν•˜λŠ” κΈ°λŠ₯을 μΌμ»«μŠ΅λ‹ˆλ‹€.

ν‘œμ€€ 빌트인 μƒμ„±μž ν•¨μˆ˜λŠ” μ›μ‹œ 값을 κ°μ‹ΈλŠ” Wrapper κ°μ²΄μž…λ‹ˆλ‹€. String, Number, Boolean을 new 없이 ν˜ΈμΆœν•˜λŠ” ν˜•νƒœμ£ . ν‘œμ€€ 빌트인 λ©”μ„œλ“œλŠ” 빌트인 객체의 곡톡적인 κΈ°λŠ₯을 μ •μ˜ν•œ μ§‘ν•©μž…λ‹ˆλ‹€. μš°μ„ μ€ μ΄λ ‡κ²Œλ§Œ μ•Œμ•„λ‘μ‹œκ³ , μžμ„Έν•œ λ‚΄μš©μ€ λΉŒνŠΈμΈμ„ κ³΅λΆ€ν•˜λŠ” μž₯μ—μ„œ μ΄ν•΄ν•˜μ£ !

  1. λ¬Έμžμ—΄ νƒ€μž… λ³€ν™˜
  • String μƒμ„±μž ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜λŠ” λ°©λ²•μœΌλ‘œ, new μ—°μ‚°μžλ₯Ό ν˜ΈμΆœν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

    let a = String(1);                    // '1'
  • Object.prototype.toString λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜λŠ” λ°©λ²•μž…λ‹ˆλ‹€.

    let a = Object.prototype.toString(1); // '1'
  • 암묡적 νƒ€μž… λ³€ν™˜μΈ (+) λ¬Έμžμ—΄ μ—°κ²° μ—°μ‚°μžλ₯Ό μ‚¬μš©ν•˜λŠ” λ°©λ²•μž…λ‹ˆλ‹€. μ˜ˆμ œλŠ” 닀루지 μ•ŠμŠ΅λ‹ˆλ‹€. μœ„μ— μžˆμœΌλ‹ˆκΉŒμš”!

  • 더 λ§Žμ€ 예제λ₯Ό λ³ΌκΉŒμš”?

    ν‘œν˜„μ‹ κ²°κ³Ό
    console.log(String(1)); '1'
    console.log(String(NaN)); 'NaN'
    console.log(String(Infinity)); 'Infinity'
    console.log(String(true)); 'true'
    console.log(String(false)); 'false'
    console.log((1).toString()); '1'
    console.log((NaN).toString()); 'NaN'
    console.log((Infinity).toString()); 'Infinity'
    console.log((true).toString()); 'true'
    console.log((false).toString()); 'false'
  1. 숫자 νƒ€μž… λ³€ν™˜
  • Number μƒμ„±μž ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜λŠ” λ°©λ²•μœΌλ‘œ, new μ—°μ‚°μžλ₯Ό ν˜ΈμΆœν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

    let a = Number('1');        // 1
  • parseInt, parseFloat λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜λŠ” λ°©λ²•μž…λ‹ˆλ‹€.

    let a = parseInt('1');      // 1
    let b = parseFloat('1.00'); // 1.00
  • 단항 μ‚°μˆ  μ—°μ‚°μž (+, *)λ₯Ό μ‚¬μš©ν•˜λŠ” λ°©λ²•μž…λ‹ˆλ‹€.

    let a = +'0';               // 0
    let b = '0' * 1;            // 0
  • 더 λ§Žμ€ 예제λ₯Ό λ³ΌκΉŒμš”?

    ν‘œν˜„μ‹ κ²°κ³Ό
    console.log(Number('0')); 0
    console.log(Number('-1')); -1
    console.log(Number('10.53')); 10.53
    console.log(Number(true)); 1
    console.log(Number(false)); 0
    console.log(parseInt('0')); 0
    console.log(parseInt('-1')); -1
    console.log(parseFloat('10.53')); 10.53
    console.log(+'0'); 0
    console.log(+'-1'); -1
    console.log(+'10.53'); 10.53
    console.log(+true); 1
    console.log(+false); 0
    console.log('0' * 1); 0
    console.log('-1' * 1); -1
    console.log('10.53' * 1); 10.53
    console.log(true * 1); 1
    console.log(false * 1); 0
  1. λΆˆλ¦¬μ–Έ νƒ€μž… λ³€ν™˜
  • Boolean μƒμ„±μž ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜λŠ” λ°©λ²•μœΌλ‘œ, new μ—°μ‚°μžλ₯Ό ν˜ΈμΆœν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

    let a = Boolean('X');   // true
    let a = Boolean('');    // false
  • λΆ€μ • 논리 μ—°μ‚°μž(!)λ₯Ό 두 번 μ‚¬μš©ν•˜λŠ” λ°©λ²•μž…λ‹ˆλ‹€.

    let a = !!'X';          // true
    let a = !!'';           // false
  • 더 λ§Žμ€ 예제λ₯Ό λ³ΌκΉŒμš”?

    ν‘œν˜„μ‹ κ²°κ³Ό
    console.log(Boolean('x')); true
    console.log(Boolean('')); false
    console.log(Boolean('false')); true
    console.log(Boolean(0)); false
    console.log(Boolean(1)); true
    console.log(Boolean(NaN)); false
    console.log(Boolean(Infinity)); true
    console.log(Boolean(null)); false
    console.log(Boolean(undefined)); false
    console.log(Boolean({})); true
    console.log(Boolean([])); true
    console.log(!!'x'); true
    console.log(!!''); false
    console.log(!!'false'); true
    console.log(!!0); false
    console.log(!!1); true
    console.log(!!NaN); false
    console.log(!!Infinity); true
    console.log(!!null); false
    console.log(!!undefined); false
    console.log(!!{}); true
    console.log(!![]); true