๋ชจ๋“  ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐœ๋ฐœ์ž๊ฐ€ ์•Œ์•„์•ผ ํ•˜๋Š” 33๊ฐ€์ง€ ๊ฐœ๋…

 

GitHub - yjs03057/33-js-concepts: ๋ชจ๋“  ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐœ๋ฐœ์ž๊ฐ€ ์•Œ์•„์•ผ ํ•˜๋Š” 33๊ฐ€์ง€ ๊ฐœ๋…

๋ชจ๋“  ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐœ๋ฐœ์ž๊ฐ€ ์•Œ์•„์•ผ ํ•˜๋Š” 33๊ฐ€์ง€ ๊ฐœ๋…. Contribute to yjs03057/33-js-concepts development by creating an account on GitHub.

github.com

์•”์‹œ์  ํ˜•๋ณ€ํ™˜(Implicit Coercion)

Javascript์˜ ์•”์‹œ์  ํ˜•๋ณ€ํ™˜์€ ์ •ํ•ด์ง€์ง€ ์•Š์€ ๊ฐ’ ์œ ํ˜•์„ ์˜ˆ์ƒ๋˜๋Š” ์œ ํ˜•์œผ๋กœ ๊ฐ•์ œ ๋ณ€ํ™˜ํ•˜๋ ค๋Š” Javascript์˜ ์„ฑ์งˆ์ž…๋‹ˆ๋‹ค.
์ด๋กœ ์ธํ•ด ์‚ฌ์šฉ์ž๋Š” ์ˆซ์ž ๊ฐ’์„ ๋„˜๊ฒจ์•ผ ํ•˜๋Š” ๊ณณ์— ๋ฌธ์ž์—ด์„ ๋„ฃ์„ ์ˆ˜๋„ ์žˆ๊ณ , ๋ฌธ์ž์—ด์„ ๋„ฃ์–ด์•ผ ํ•˜๋Š” ๊ณณ์— ๊ฐ์ฒด๋ฅผ ๋„˜๊ธฐ๋Š” ์‹ค์ˆ˜๋ฅผ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
์ด๋Š” Javascript์˜ ์ฃผ์š” ๊ธฐ๋Šฅ์ด์ง€๋งŒ, ๊ฐ€์žฅ ํ”ผํ•ด์•ผ ํ•  ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.
Javascript๋Š” ๋‹ค๋ฅธ ์–ธ์–ด์™€ ๋‹ฌ๋ฆฌ ํƒ€์ž…์— ๊ต‰์žฅํžˆ ์œ ์—ฐํ•ฉ๋‹ˆ๋‹ค.

3 * '3'; // 9
1 + '2' + 1; // 121

true + true; // 2
10 - true; // 9

const foo = {
  valueOf: () => 2
};
3 + foo; // 5
4 * foo; // 8

const bar = {
  toString: () => ' promise is a boy :)'
};
1 + bar; // "1 promise is a boy :)"

4 * []; // 0
4 * [2]; // 8
4 + [2]; // "42"
4 + [1, 2]; // "41,2"
4 * [1, 2]; // NaN

'string' ? 4 : 1; // 4
undefined ? 4 : 1; // 1

์ˆซ์ž ํ‘œํ˜„์‹์—์„œ ์ˆซ์ž๊ฐ€ ์•„๋‹Œ ๊ฐ’

String(๋ฌธ์ž์—ด)

์ˆซ์ž ๋ฌธ์ž(Numeric Characters)๋ฅผ ๊ฐ€์กŒ๋‹ค๋ฉด ์–ด๋–ค ๋ฌธ์ž์—ด์ด๋ผ๋„ ๋™๋“ฑํ•œ ์ˆซ์ž๋กœ ๋ฐ”๋€๋‹ˆ๋‹ค.
ํ•˜์ง€๋งŒ ๋งŒ์ผ ๋ฌธ์ž์—ด์— ์ˆซ์ž๊ฐ€ ์•„๋‹Œ ๊ฒƒ(Non-Numeric Characters)์ด ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฉด NaN(Not a Number)์„ ๋ฆฌํ„ดํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

๋”ํ•˜๊ธฐ ์—ฐ์‚ฐ์ž(+)

๋”ํ•˜๊ธฐ ์—ฐ์‚ฐ์ž๋Š” ํฌ๊ฒŒ 2๊ฐ€์ง€ ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  • ์ˆ˜ํ•™์ ์ธ ๋ง์…ˆ
  • ๋ฌธ์ž์—ด ํ•ฉ์น˜๊ธฐ(๊ฒฐํ•ฉ์—ฐ์‚ฐ์ž)

๋˜ํ•œ, ๋”ํ•˜๊ธฐ ์—ฐ์‚ฐ์ž๋Š” ๋‘ ๊ฐ€์ง€ ํŠน์ง•์„ ์ง€๋‹™๋‹ˆ๋‹ค.

  • ๋”ํ•˜๊ธฐ ์—ฐ์‚ฐ์ž์—์„œ๋Š” ๋ฌธ์ž์˜ ์šฐ์„ ์ˆœ์œ„๊ฐ€ ์ˆซ์ž๋ณด๋‹ค ๋†’์Šต๋‹ˆ๋‹ค.
  • ๊ฐ์ฒด์™€ ํ•จ์ˆ˜ ๋˜ํ•œ ๋ฌธ์ž๋ณด๋‹ค ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋‚ฎ์Šต๋‹ˆ๋‹ค.

๊ทธ ์™ธ ์—ฐ์‚ฐ์ž(-, *, /, %)

  • ๋”ํ•˜๊ธฐ ์—ฐ์‚ฐ์ž๋ฅผ ์ œ์™ธํ•œ ์—ฐ์‚ฐ์ž์—์„œ๋Š” ์ˆซ์ž์˜ ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋ฌธ์ž๋ณด๋‹ค ๋†’์Šต๋‹ˆ๋‹ค.
  • ์ˆซ์ž๊ฐ€ ์•„๋‹Œ ๋ฌธ์ž์—ด์ด ๋“ค์–ด๊ฐˆ ๊ฒฝ์šฐ ์—ฐ์‚ฐ์ด ๋ถˆ๊ฐ€๋Šฅํ•ด NaN์ด ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค.
3 * '3'; // 3 * 3
3 * Number('3'); // 3 * 3
Number('5'); // 5

Number('1.'); // 1
Number('1.34'); // 1.34
Number('0'); // 0
Number('012'); // 12

Number('1,'); // NaN
Number('1+1'); // NaN
Number('1a'); // NaN
Number('la'); // NaN
Number('one'); // NaN
Number('text'); // NaN

๊ฐ์ฒด(Object)

Javascript์—์„œ ๊ฐ์ฒด์˜ ๋Œ€๋ถ€๋ถ„์˜ ์•”๋ฌต์  ํ˜•๋ณ€ํ™˜์€ ๊ฒฐ๊ณผ ๊ฐ’์œผ๋กœ [object Object]๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

'name' + {}; // "name[object Object]"

๋ชจ๋“  Javascript ๊ฐ์ฒด๋Š” toString ๋ฉ”์†Œ๋“œ๋ฅผ ์ƒ์†๋ฐ›์Šต๋‹ˆ๋‹ค. ์ƒ์†๋ฐ›์€ toString ๋ฉ”์†Œ๋“œ๋Š” ๊ฐ์ฒด๊ฐ€ ๋ฌธ์ž์—ด ํƒ€์ž…์œผ๋กœ ๋ณ€ํ•ด์•ผ ํ•  ๋•Œ๋งˆ๋‹ค ์“ฐ์ž…๋‹ˆ๋‹ค.
toString์˜ ๋ฐ˜ํ™˜ ๊ฐ’์€ ๋ฌธ์ž์—ด ํ•ฉ์น˜๊ธฐ(string concatenation) ํ˜น์€ ์ˆ˜ํ•™์  ํ‘œํ˜„์‹(mathematical expressions)๊ณผ ๊ฐ™์€ ์—ฐ์‚ฐ์—์„œ ์“ฐ์ด๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

const foo = {};
foo.toString(); // [object Object]

const baz = {
  toString: () => "I'm object baz"
};

baz + '!'; // "I'm object baz!"

๊ฐ์ฒด๊ฐ€ ์ˆ˜ํ•™์  ํ‘œํ˜„์‹ ์‚ฌ์ด์— ๋“ค์–ด๊ฐ”์„ ๋•Œ๋Š”, Javascript๋Š” ๋ฐ˜ํ™˜ ๊ฐ’์„ ์ˆซ์ž๋กœ ๋ณ€ํ™˜ํ•˜๋ ค ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

const foo = {
  toString: () => 4
};

2 * foo; // 8
2 / foo; // 0.5
2 + foo; // 6
'four' + foo; // "four4"

const baz = {
  toString: () => 'four'
};

2 * baz; // NaN
2 + baz; // 2four

const bar = {
  toString: () => '2'
};

2 + bar; // "22"
2 * bar; // 4

๋ฐฐ์—ด ๊ฐ์ฒด(Array Object)

๋ฐฐ์—ด์—์„œ ์ƒ์†๋œ toString ๋ฉ”์†Œ๋“œ๋Š” ์•ฝ๊ฐ„ ๋‹ค๋ฅด๊ฒŒ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.
์ด๊ฒƒ์€ ๋ฐฐ์—ด์—์„œ ์•„๋ฌด๋Ÿฐ ์ธ์ž๋„ ๋„ฃ์ง€ ์•Š์€ join ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ ๊ฒƒ๊ณผ ๋น„์Šทํ•œ ๋ฐฉ์‹์œผ๋กœ ์ž‘๋™ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

[1, 2, 3].toString() // "1,2,3"
[1, 2, 3].join() // "1,2,3"
[].toString() // ""
[].join() // ""

"me" + [1,2,3] // "me1,2,3"
4 + [1,2,3] // "41,2,3"
4 * [1,2,3] // NaN
4 * []; // 0
4 / [2]; // 2

//similar to
4 * Number([].toString());
4 * Number('');
4 * 0;

//

4 / Number([2].toString());
4 / Number('2');
4 / 2;

True, False ๊ทธ๋ฆฌ๊ณ  ""

Number(true); // 1
Number(false); // 0
Number(''); // 0

4 + true; // 5
3 * false; // 0
3 * ''; // 0
3 + ''; // 3

valueOf ๋ฉ”์†Œ๋“œ

๋ฌธ์ž์—ด์ด๋‚˜ ์ˆซ์ž๊ฐ€ ์˜ฌ ๊ณณ์— ๊ฐ์ฒด๋ฅผ ๋„˜๊ธธ ๋•Œ๋งˆ๋‹ค Javascript ์—”์ง„์— ์˜ํ•ด ์‚ฌ์šฉ๋  valueOf ๋ฉ”์†Œ๋“œ๋ฅผ ์ •์˜ํ•˜๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

const foo = {
  valueOf: () => 3
};

3 + foo; // 6
3 * foo; // 9

๊ฐ์ฒด์— toString๊ณผ valueOf ๋ฉ”์†Œ๋“œ๊ฐ€ ์ „๋ถ€ ์ •์˜๋˜์–ด ์žˆ์„ ๋•Œ๋Š” Javascript ์—”์ง„์€ valueOf ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

const bar = {
  valueOf: () => 5,
  toString: () => 2
};

'sa' + bar; // "sa5"
3 * bar; // 15
2 + bar; // 7

valueOf ๋ฉ”์†Œ๋“œ๋Š” ๊ฐ์ฒด๊ฐ€ ์–ด๋– ํ•œ ์ˆซ์ž ๊ฐ’์„ ๋‚˜ํƒ€๋‚ผ ๋•Œ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ๋งŒ๋“ค์–ด์กŒ์Šต๋‹ˆ๋‹ค.

const two = new Number(2);

two.valueOf(); // 2

Falsy์™€ Truthy

๋ชจ๋“  Javascript ๊ฐ’์€ true๋‚˜ false๋กœ ๋ณ€ํ™˜๋  ์ˆ˜ ์žˆ๋Š” ํŠน์„ฑ์„ ๊ฐ–๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
true๋กœ ํ˜•๋ณ€ํ™˜์„ ๊ฐ•์ œํ•˜๋Š” ๊ฒƒ์„ truthy๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.
๋˜ false๋กœ ํ˜•๋ณ€ํ™˜์„ ๊ฐ•์ œํ•˜๋Š” ๊ฒƒ์„ falsy๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ์€ Javascript์—์„œ ๋ฐ˜ํ™˜ ์‹œ์— falsy๋กœ ์ทจ๊ธ‰๋˜๋Š” ๊ฐ’๋“ค์ž…๋‹ˆ๋‹ค.

  1. false
  2. 0
  3. null
  4. undefined
  5. ""
  6. NaN
  7. -0

์ด ์™ธ์—๋Š” ์ „๋ถ€ truthy๋กœ ์ทจ๊ธ‰๋ฉ๋‹ˆ๋‹ค.

if (-1) // truthy
if ("0") // truthy
if ({}) // truthy

์œ„์˜ ์ฝ”๋“œ์ฒ˜๋Ÿผ truthy๋ฅผ ์ด์šฉํ•ด๋„ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค.
ํ•˜์ง€๋งŒ ๊ฐ’์ด ์ฐธ์ž„์„ ๋ช…์‹œ์ ์œผ๋กœ ํ‘œํ˜„ํ•ด์ฃผ๋Š” ๊ฒƒ์ด ๋” ์ข‹์€ ์ž‘์„ฑ๋ฒ•์ž…๋‹ˆ๋‹ค.
๋ช…์‹ฌํ•ด์•ผ ํ•  ๊ฒƒ์€ ๊ฐœ๋ฐœ์ž๊ฐ€ Javascript์˜ ์•”์‹œ์  ํ˜•๋ณ€ํ™˜(implicit coercion)์„ ์™„๋ฒฝํžˆ ์ดํ•ดํ–ˆ๋”๋ผ๋„, Javascript์˜ ์•”์‹œ์  ํ˜•๋ณ€ํ™˜์— ์˜์กดํ•˜์ง€ ์•Š์•˜์œผ๋ฉด ํ•ฉ๋‹ˆ๋‹ค.

 

<์•ˆ ์ข‹์€ ์˜ˆ>

const counter = 2

if(counter)

๋‹ค์Œ์˜ ์ฝ”๋“œ๊ฐ€ ํ›จ์”ฌ ์ข‹์€ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.

if(counter === 2)

// or

if(typeof counter === "number")

์•„๋ž˜ ํ•จ์ˆ˜๋Š” Number ํƒ€์ž…์˜ ๋ณ€์ˆ˜๋ฅผ ๋ฐ›์•„ ์‹คํ–‰ํ•˜๋„๋ก ํ•˜๊ณ  ์‹ถ์–ด ๋งŒ๋“  ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.

const add = (number) => {
  if (!number) new Error('Only accepts arguments of type: number');
  // your code
};

์œ„์™€ ๊ฐ™์€ ๊ฒฝ์šฐ์—๋Š” ์ธ์ž ๊ฐ’์œผ๋กœ 0์„ ์ฃผ๋ฉด ์˜๋„์น˜ ์•Š์€ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

add(0); // Error: Only accepts arguments of type: number

//better check

const add = (number) => {
  if (typeof number !== 'number')
    new Error('Only accepts arguments of type: number');
  //your code
};

add(0); // no error

NaN(Not a Number)

NaN์€ ์ž๊ธฐ ์ž์‹ ๊ณผ๋„ ๊ฐ™์ง€ ์•Š์€ ํŠน๋ณ„ํ•œ ์ˆซ์ž ๊ฐ’์ž…๋‹ˆ๋‹ค.
Javascript์—์„œ ์œ ์ผํ•˜๊ฒŒ ์ž๊ธฐ ์ž์‹ ๊ณผ ๊ฐ™์ง€ ์•Š์€ ๊ฐ’์ž…๋‹ˆ๋‹ค.

NaN === NaN; // false

const notANumber = 3 * 'a'; // NaN

notANumber == notANumber; // false
notANumber === notANumber; // false

if (notANumber !== notANumber) // true

ES6(ECMAScript6)์—์„œ๋Š” NaN์„ ์ฒดํฌํ•˜๊ธฐ ์œ„ํ•œ ๋ฉ”์†Œ๋“œ(Number.isNaN)๊ฐ€ ๋“ฑ์žฅํ–ˆ์Šต๋‹ˆ๋‹ค.

Number.isNaN(NaN); // true
Number.isNaN('name'); // false

์ „์—ญ isNaNํ•จ์ˆ˜์— ๋Œ€ํ•ด์„œ๋„ ์•Œ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.
์ด ํ•จ์ˆ˜๋Š” ์ธ์ž๊ฐ€ ์‹ค์ œ๋กœ NaN์ธ์ง€ ์ฒดํฌํ•˜๊ธฐ ์ „์— ์ธ์ž๋กœ ๋“ค์–ด์˜จ ๊ฐ’์˜ ํ˜•๋ณ€ํ™˜์„ ๊ฐ•์ œํ•ฉ๋‹ˆ๋‹ค.

isNaN('name'); // true
isNaN('1'); // false

์ „์—ญ isNaNํ•จ์ˆ˜๋Š” ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

const coerceThenCheckNaN = (val) => {
  const coercedVal = Number(val);
  return coercedVal !== coercedVal ? true : false;
};

coerceThenCheckNaN('1a'); // true
coerceThenCheckNaN('1'); // false
coerceThenCheckNaN('as'); // true
coerceThenCheckNaN(NaN); // true
coerceThenCheckNaN(10); // false

๋ช…์‹œ์  ํ˜•๋ณ€ํ™˜(Explicit Coercion)

๋ช…์‹œ์  ๋ณ€ํ™˜(Explicit Conversion)์€ ๊ฐœ๋ฐœ์ž๊ฐ€ ์˜๋„์ ์œผ๋กœ ํ˜•๋ณ€ํ™˜์„ ํ•˜๋Š” ์ž…๋‹ˆ๋‹ค.
๋ช…์‹œ์  ํ˜•๋ณ€ํ™˜์€ ์ฃผ๋กœ String, Number, Boolean ํƒ€์ž…์œผ๋กœ ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค.
Symbol์€ ์ž์ฃผ ์‚ฌ์šฉ๋˜์ง€ ์•Š๊ณ , null๊ณผ undefined๋Š” ์ž๋ฃŒํ˜•์ด๋ฉด์„œ ๋™์‹œ์— ๊ฐ’์ด๊ธฐ ๋•Œ๋ฌธ์— ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๊ทธ๋ƒฅ ๊ทธ ๊ฐ’์„ ํ• ๋‹นํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.
Object๋„ Date ๊ฐ์ฒด๋ฅผ ์ˆซ์ž๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ํŠน๋ณ„ํ•œ ๊ฒฝ์šฐ๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด, ๊ทธ๋ƒฅ ์ˆœ์ „ํžˆ ๊ฐ’์„ Object๋กœ ๋งŒ๋“ค๋ฉด ๋งŒ๋“ค์—ˆ์ง€ ๊ตณ์ด Object๋กœ ํ˜• ๋ณ€ํ™˜ํ•˜๋Š” ์ผ์€ ์—†์Šต๋‹ˆ๋‹ค.

String()

console.log(String(123)); // 123
console.log(String(NaN)); // NaN
console.log(String(1 / 0)); // Infinity
console.log(String(-1 / 0)); // -Infinity
console.log(String(true)); // true
console.log(String(false)); // true
console.log(String(undefined)); // undefined
console.log(String(null)); // null
console.log(String({ name: 'bigtop' })); // [object Object]

๋ฌธ์ž์—ด์ด ์•„๋‹Œ ๊ฐ’์„ ๋ฌธ์ž์—ด๋กœ ๋ฐ”๊พธ๋ ค๋ฉด ์ด๋ ‡๊ฒŒ String ํ•จ์ˆ˜๋ฅผ ํ™œ์šฉํ•˜๋ฉด ๋˜๋Š”๋ฐ, ์†Œ๊ด„ํ˜ธ ์•ˆ์— ๊ฐ’์„ ๋„ฃ์–ด์ฃผ๋ฉด ๊ทธ ๊ฐ’์ด ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ•ฉ๋‹ˆ๋‹ค.
๊ฐ์ฒด์˜ ๊ฒฝ์šฐ์—๋Š” [object Object]๊ฐ€ ์ถœ๋ ฅ๋˜๋Š”๋ฐ ์šฐ๋ฆฌ๊ฐ€ ๋ฐ”๋ผ๋ณด๋Š” ๊ฐ์ฒด์˜ ๋ชจ์–‘ ๊ทธ๋Œ€๋กœ๋ฅผ ๋ฌธ์ž์—ด๋กœ ๋งŒ๋“ค๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ์—๋Š” JSON๊ฐ์ฒด์˜ stringify ๋ฉ”์†Œ๋“œ๋ฅผ ํ™œ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

console.log(JSON.stringify({ name: 'bigtop' })); // {"name": "bigtop"}

Number()

console.log(Number('')); // 0
console.log(Number('abc')); // NaN
console.log(Number('123')); // 123
console.log(Number('123a')); // NaN
console.log(Number(true)); // 1
console.log(Number(false)); // 0
console.log(Number(null)); // 0
console.log(Number(undefined)); // NaN
console.log(Number({ name: 'bigtop' })); // NaN
console.log(Number({})); // NaN

๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ˆซ์ž๊ฐ€ ์•„๋‹Œ ๊ฐ’์„ ์ˆซ์ž๋กœ ๋ฐ”๊พธ๋ ค๋ฉด ์ด๋ ‡๊ฒŒ Number ํ•จ์ˆ˜๋ฅผ ํ™œ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

  • ๋นˆ ๋ฌธ์ž์—ด์€ 0์œผ๋กœ ๋ฐ˜ํ™˜
  • ์ˆซ์ž์™€ ๋ฌธ์ž๊ฐ€ ํ˜ผํ•ฉ๋œ ๋ฌธ์ž์—ด์€ NaN ๋ฐ˜ํ™˜
  • Boolean ํ˜•ํƒœ์˜ ๊ฐ’์€ true๋Š” 1, false๋Š” 0 ๋ฐ˜ํ™˜
  • null์€ 0, undefined๋Š” NaN ๋ฐ˜ํ™˜
  • ๋นˆ ๊ฐ์ฒด๋Š” NaN ๋ฐ˜ํ™˜

์ฐธ๊ณ ๋กœ '123a'์™€ ๊ฐ™์€ ์ˆซ์ž์™€ ๋ฌธ์ž๊ฐ€ ํ˜ผํ•ฉ๋œ ๊ฒฝ์šฐ์—๋„ ์ˆซ์ž๋กœ ์‹œ์ž‘ํ•˜๋Š” ๋ฌธ์ž์—ด์ธ ๊ฒฝ์šฐ parseInt ํ˜น์€ parseFloat ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ˆซ์ž ํ˜•ํƒœ๋กœ ๋ณ€ํ™˜์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

// ์ฒซ ๋ฌธ์ž๊ฐ€ ์ˆซ์ž์ธ ๊ฒฝ์šฐ parseInt๋Š” ์ •์ˆ˜ํ˜•์œผ๋กœ ํ•ด์„์ด ๊ฐ€๋Šฅํ•œ ๋งŒํผ ์ˆซ์ž๋กœ ๋ณ€ํ™˜.
console.log(parseInt('123a')); // 123
console.log(parseInt('1.23a')); // 1

// ์ฒซ ๋ฌธ์ž๊ฐ€ ์ˆซ์ž์ด๊ฑฐ๋‚˜ ์†Œ์ˆซ์ ์ธ ๊ฒฝ์šฐ parseFloat์€ ์†Œ์ˆ˜ํ˜•์œผ๋กœ ํ•ด์„์ด ๊ฐ€๋Šฅํ•œ ๋งŒํผ ์ˆซ์ž๋กœ ๋ณ€ํ™˜
console.log(parseFloat('1.23a')); // 1.23
console.log(parseFloat('.23a')); // 0.23

// ์ฒซ ๋ฌธ์ž๊ฐ€ ๋ฌธ์ž์ผ ๊ฒฝ์šฐ๋Š” NaN๊ฐ’์œผ๋กœ ๋ณ€ํ™˜.
console.log(parseInt('a123')); // NaN
console.log(parseFloat('a1.23')); // NaN

Boolean()

console.log(Boolean('')); // false
console.log(Boolean('abc')); // true
console.log(Boolean('123')); // true
console.log(Boolean('0')); // true
console.log(Boolean(0)); // false
console.log(Boolean(123)); // true
console.log(Boolean(NaN)); // false
console.log(Boolean(null)); // false
console.log(Boolean(undefined)); // false
console.log(Boolean({ name: 'bigtop' })); // true
console.log(Boolean({})); // true

๋ช…์นญ์  ํƒ€์ดํ•‘(Nominal Typing)

๋ช…์นญ์  ํƒ€์ดํ•‘(Nominal Typing) ๋ฐฉ์‹์€ ํŠน์ • ํ‚ค์›Œ๋“œ๋ฅผ ํ†ตํ•˜์—ฌ ํƒ€์ž…์„ ์ง€์ •ํ•ด ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.
C++์ด๋‚˜ Java์™€ ๊ฐ™์€ ์–ธ์–ด๊ฐ€ ๋ช…์นญ์  ํƒ€์ดํ•‘(Nominal Typing) ์ฆ‰ 'ํƒ€์ž…'์„ ์ •ํ•ด์„œ ๊ฐœ๋ฐœํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.
ํƒ€์ž…์„ ๋ฏธ๋ฆฌ ์ •ํ•ด์„œ ๊ฐœ๋ฐœํ•˜๊ฒŒ ๋˜๋ฉด ์˜ค๋ฅ˜๋ฅผ ์ค„์ด๊ณ  ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์ˆ˜์›”ํ•˜์ง€๋งŒ Javascript์—์„œ๋Š” ํƒ€์ž…์„ ์ง€์ •ํ•˜๋Š” ๊ฒƒ์ด ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
์ด ๊ฐ™์€ Javascript์˜ ๋‹จ์ ์„ ๋ณด์™„ํ•˜๊ธฐ ์œ„ํ•ด ๋งˆ์ดํฌ๋กœ์†Œํ”„ํŠธ์—์„œ TypeScript๋ฅผ ๊ฐœ๋ฐœํ–ˆ์Šต๋‹ˆ๋‹ค.

int num = 10;
char str = "a";

num = str; // ERROR!!
num = "a"; // ERROR!!
str = 10; // ERROR!!

์œ„์™€ ๊ฐ™์€ ์ƒํ™ฉ์—์„œ num์€ intํ˜•์œผ๋กœ str์€ charํ˜•์œผ๋กœ ์„ ์–ธ๋์Šต๋‹ˆ๋‹ค.
๋”ฐ๋ผ์„œ ์„œ๋กœ ํƒ€์ž…์ด ๋งž์ง€ ์•Š๋Š” ๊ฐ’์„ ๋Œ€์ž… ์—ฐ์‚ฐ์ž(=)๋ฅผ ์ด์šฉํ•ด ๋Œ€์ž…ํ•˜๋ ค ํ•  ๊ฒฝ์šฐ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

class Foo {};
class Bar {};

Foo foo = new Bar();

ํด๋ž˜์Šค์—์„œ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์œ„์˜ ์˜ˆ์‹œ์˜ Foo์™€ Bar๋Š” ์„œ๋กœ ํ˜ธํ™˜์ด ๋ถˆ๊ฐ€๋Šฅํ•œ ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค.

class Foo {};
class Bar extends Foo {};

Foo foo = new Bar();

์œ„์™€ ๊ฐ™์ด extends๋ฅผ ์ด์šฉํ•ด ์„œ๋กœ ํด๋ž˜์Šค ๊ฐ„์˜ ์ƒํ˜ธ ํ˜ธํ™˜์„ ๋ช…์‹œํ•˜๋ฉด ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ตฌ์กฐ์  ํƒ€์ดํ•‘(Structural Typing)

๊ตฌ์กฐ์  ํƒ€์ดํ•‘(Structural Typing)์€ ๋ฉค๋ฒ„์— ๋”ฐ๋ผ ํƒ€์ž…์„ ๊ฒ€์‚ฌํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.
๋ช…์นญ์  ํƒ€์ดํ•‘(Nominal Typing)๊ณผ ๋ฐ˜๋Œ€๋˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ TypeScript, Go ๋“ฑ์—์„œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
๊ตฌ์กฐ์  ํƒ€์ดํ•‘(Structural Typing)์€ ๋‘ ๋ฐ์ดํ„ฐ์˜ ํƒ€์ž… ๊ตฌ์กฐ๋ฅผ ๋น„๊ตํ•˜์—ฌ ํ˜ธํ™˜๋˜๋Š” ํƒ€์ž…์ธ์ง€ ๊ฒ€์‚ฌํ•ฉ๋‹ˆ๋‹ค.
ํ•œ ํƒ€์ž…์ด ๋‹ค๋ฅธ ํƒ€์ž…์ด ๊ฐ–๋Š” ๋ฉค๋ฒ„๋ฅผ ๋ชจ๋‘ ๊ฐ€์ง€๊ณ  ์žˆ์„ ๊ฒฝ์šฐ ๋‘ ํƒ€์ž…์€ ํ˜ธํ™˜๋˜๋Š” ํƒ€์ž…์ž…๋‹ˆ๋‹ค.

  • Typescript์˜ ํ•ต์‹ฌ ์›์น™ ์ค‘ ํ•˜๋‚˜๋Š” ํƒ€์ž… ๊ฒ€์‚ฌ๊ฐ€ ๊ฐ’์ด ์žˆ๋Š” ํ˜•ํƒœ์— ์ง‘์ค‘ํ•˜๋Š” ๊ฒƒ.
  • ๋‘ ๊ฐ์ฒด๊ฐ€ ๊ฐ™์€ ํ˜•ํƒœ๋ฅผ ๊ฐ€์ง€๋ฉด ๊ฐ™์€ ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผ.
interface Point {
  x: number;
  y: number;
}

function printPoint(p: Point) {
  console.log(`${p.x}, ${p.y}`);
}

const point = { x: 12, y: 26 }; //์—ฌ๊ธฐ ๋ณ€์ˆ˜๋Š” Point ํƒ€์ž…์œผ๋กœ ์„ ์–ธ ๋œ ์ ์ด ์—†์ง€๋งŒ,
printPoint(point);

// Typescript๋Š” ํƒ€์ž… ๊ฒ€์‚ฌ์—์„œ point์™€ Point ํ˜•ํƒœ๋ฅผ ๋น„๊ต, ๋‘˜ ๋‹ค ๊ฐ™์€ ํ˜•ํƒœ๋ผ ํ†ต๊ณผ!

ํ˜•ํƒœ ์ผ์น˜์—์„œ๋Š” ์ผ์น˜์‹œํ‚ฌ ๊ฐ์ฒด์˜ ํ•„๋“œ์˜ ํ•˜์œ„ ์ง‘ํ•ฉ๋งŒ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
๊ฐ์ฒด ๋˜๋Š” ํด๋ž˜์Šค์— ํ•„์š”ํ•œ ๋ชจ๋“  ์†์„ฑ์ด ์žˆ๋‹ค๋ฉด? Typescript๋Š” ๊ตฌํ˜„ ์„ธ๋ถ€ ์ •๋ณด์— ๊ด€๊ณ„์—†์ด ์ผ์น˜ํ•˜๋‹ค๊ณ  ๊ฐ„์ฃผํ•ฉ๋‹ˆ๋‹ค.

interface Point { ๐Ÿ‘ˆ ์—ฌ๊ธฐ์˜ ์†์„ฑ์ด๋ž‘
    x: number;
    y: number;
}

function printPoint (p: Point) {
    console.log(`${p.x}, ${p.y}`);
}

class VirtualPoint { ๐Ÿ‘ˆ ์—ฌ๊ธฐ์˜ ์†์„ฑ์ด ๊ฐ™๋‹ค
    x: number;
    y: number; // ๋ชจ๋“  ์†์„ฑ์ด ๋‹ค ์žˆ์Œ!
    constructor(x: number, y: number){
        this.x = x;
        this.y = y;
    }
}

const newVPoint = new VirtualPoint(13, 56);

printPoint (newVPoint);

๋• ํƒ€์ดํ•‘(Duck Typing)

์ปดํ“จํ„ฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ถ„์•ผ์—์„œ ๋• ํƒ€์ดํ•‘(duck typing) ์€ ๋™์  ํƒ€์ดํ•‘์˜ ํ•œ ์ข…๋ฅ˜๋กœ, ๊ฐ์ฒด์˜ ๋ณ€์ˆ˜ ๋ฐ ๋ฉ”์†Œ๋“œ์˜ ์ง‘ํ•ฉ์ด ๊ฐ์ฒด์˜ ํƒ€์ž…์„ ๊ฒฐ์ •ํ•˜๋Š” ๊ฒƒ์„ ๋œปํ•ฉ๋‹ˆ๋‹ค.
ํด๋ž˜์Šค ์ƒ์†์ด๋‚˜ ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„์œผ๋กœ ํƒ€์ž…์„ ๊ตฌ๋ถ„ํ•˜๋Š” ๋Œ€์‹ , ๋• ํƒ€์ดํ•‘์€ ๊ฐ์ฒด๊ฐ€ ์–ด๋–ค ํƒ€์ž…์— ๊ฑธ๋งž์€ ๋ณ€์ˆ˜์™€ ๋ฉ”์†Œ๋“œ๋ฅผ ์ง€๋‹ˆ๋ฉด ๊ฐ์ฒด๋ฅผ ํ•ด๋‹น ํƒ€์ž…์— ์†ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผํ•ฉ๋‹ˆ๋‹ค.

 

"์–ด๋–ค ์ƒˆ๊ฐ€ ์˜ค๋ฆฌ์ฒ˜๋Ÿผ ๊ฑท๊ณ , ํ—ค์—„์น˜๊ณ , ์†Œ๋ฆฌ๋ฅผ ๋‚ธ๋‹ค๋ฉด ๊ทธ ์ƒˆ๋ฅผ ์˜ค๋ฆฌ๋ผ๊ณ  ๋ถ€๋ฅผ ๊ฒƒ์ด๋‹ค."

 

Javascript๋Š” ํƒ€์ž…์— ๋Œ€ํ•ด ์œ ์—ฐํ•œ ๋™์  ํƒ€์ž… ์–ธ์–ด์ž…๋‹ˆ๋‹ค.
๊ทธ๋ž˜์„œ Java์™€๋Š” ๋‹ค๋ฅด๊ฒŒ ํƒ€์ž…์— ๋Œ€ํ•ด์„œ๋Š” ๋ช…์‹œ์ ์œผ๋กœ ์„ ์–ธ ์—†์ด ์ž์œ ์ž์žฌ๋กœ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

// JAVA
String name = "goong";
// Javascript
const name = 'goong';

์šฐ๋ฆฌ๋Š” ์ž๋ฐ”๋ฅผ ์ •์  ํƒ€์ž… ์–ธ์–ด, Javascript๋ฅผ ๋™์  ํƒ€์ž… ์–ธ์–ด๋ผ๊ณ  ๋ถ„๋ฅ˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ •์  ํƒ€์ž…์˜ ์–ธ์–ด๋Š” ์ปดํŒŒ์ผ ์‹œ์ , ๋™์  ํƒ€์ž…์˜ ์–ธ์–ด๋Š” ๋Ÿฐํƒ€์ž„ ์‹œ์ ์— ํƒ€์ž…์ด ์ฒดํฌ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  ์ •์  ํƒ€์ž…์ด ๊ฐ€์ง€๋Š” ์žฅ์ ๊ณผ ๋™์  ํƒ€์ž…์ธ Javascript๊ฐ€ ๊ฐ€์ง€๋Š” ๋‹จ์ ์„ ๋ณด์™„ํ•ด ํƒ„์ƒํ•œ ๊ฒƒ์ด Typescript์ž…๋‹ˆ๋‹ค.
ํ•˜๋‚˜์˜ ์˜ˆ๋กœ, ์ฆ‰ Typescript๋Š” ๊ธฐ์กด์— Javascript๊ฐ€ ๊ฐ€์ง€๋˜ ๋Ÿฐํƒ€์ž„์—์„œ ์˜ค๋Š” ์ด์Šˆ๋“ค์„ ์ปดํŒŒ์ผ ์‹œ์ ์— ์•Œ์•„์ฐจ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๊ฐ„๋‹จํžˆ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์™€ Javascript๋ฅผ ๋น„๊ตํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

Typescript์˜ ์ฝ”์–ด ์›๋ฆฌ ์ค‘ ํ•˜๋‚˜๋Š” ํƒ€์ž… ์ฒดํ‚น์„ ํ˜•ํƒœ(Shape)์— ์ค‘์ ์„ ๋‘ก๋‹ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  ์ด๊ฒƒ์„ ๋• ํƒ€์ดํ•‘(Duck Typing) ๋˜๋Š” ๊ตฌ์กฐ์  ์„œ๋ธŒ ํƒ€์ดํ•‘(Structural Typing)์ด๋ผ๊ณ  ๋ถ€๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๋ ‡๋‹ค๋ฉด, ๊ตฌ์กฐ์  ์„œ๋ธŒ ํƒ€์ดํ•‘์€ ๋ฌด์—‡์„ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฒƒ์ด๊ณ , ๋• ํƒ€์ดํ•‘์€ ๋ฌด์—‡์ผ๊นŒ์š”?
๋• ํƒ€์ดํ•‘์€ ๊ฐ์ฒด ์ž์‹ ์ด ์–ด๋– ํ•œ ํƒ€์ž…์ธ์ง€๊ฐ€ ์ค‘์š”ํ•˜์ง€ ์•Š๊ณ , ํŠน์ • ๋ฉ”์†Œ๋“œ๋‚˜ ์†์„ฑ์˜ ์กด์žฌ๋กœ ํƒ€์ž…์„ ํŒ๋‹จํ•ฉ๋‹ˆ๋‹ค.
๋ฐ˜๋Œ€์˜ ๊ฒฝ์šฐ์—๋Š” ํŠน์ • ํƒ€์ž…์„ ์ •์˜ํ•จ์œผ๋กœ์จ, ๊ทธ ํƒ€์ž…์„ ํŠน์ •ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

๋• ํƒ€์ดํ•‘์€ ํŠน์ • ํƒ€์ž…์— ์–ฝ๋งค์ด์ง€ ์•Š๊ณ , ์›ํ•˜๋Š” ํ–‰๋™์„ ํ•  ์ˆ˜ ์žˆ๋Š” ์—ฌ๋ถ€๋กœ ํŒ๋‹จํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๋ž˜์„œ ํƒ€์ž…์— ์ œ์•ฝ ์—†์ด ์‚ฌ์šฉํ•˜์—ฌ ๋ณด๋‹ค ์œ ์—ฐํ•˜๊ฒŒ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

// static
let staticName: string = 'goong';
staticName = 1; // TypeError
// dynamic
let dynamicName = 'goong';
dynamicName = 1; // Ok

References

 

[JavaScript] ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ˜•๋ณ€ํ™˜(Type Conversion) ์ดํ•ดํ•˜๊ธฐ - 1

[JavaScript] ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ž๋ฃŒํ˜•(Data Type) ์ดํ•ดํ•˜๊ธฐ์—์„œ ๋ณ€์ˆ˜์™€ ์ƒ์ˆ˜์— ๋‹ด์„ ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ๊ฐ’์—๋Š” ์ข…๋ฅ˜๊ฐ€ ์žˆ๋Š”๋ฐ, ์ด๊ฒƒ์„ ์ž๋ฃŒํ˜•, Data Type์ด๋ผ๊ณ  ๋ถ€๋ฅด๊ณ  ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ๊ตฌ๋ถ„ํ•˜๋Š” 7๊ฐ€์ง€ ์ž๋ฃŒํ˜•์—

bigtop.tistory.com

 

๋ช…์‹œ์ , ์•”์‹œ์  ๋ณ€ํ™˜, Nominal, ๊ตฌ์กฐํ™”, ๋• ํƒ€์ดํ•‘

33-js-concepts๋ฅผ ์Šคํ„ฐ๋””ํ•˜๋ฉฐ ์ •๋ฆฌํ•œ ํฌ์ŠคํŠธ ์ž…๋‹ˆ๋‹ค. ํ˜•๋ณ€ํ™˜(Type Conversion)์ด๋ž€? ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜๋ฉด์„œ ๋ฌธ์ž๋ฅผ ์ˆซ์ž๋กœ, ์ˆซ์ž๋กœ ๋ฌธ์ž๋กœ ๋ณ€ํ™˜ํ•ด์•ผํ•˜๋Š” ์ž‘์—…์ด ์ƒ๊ธด๋‹ค. ์œ„์™€ ๊ฐ™์€ ์ฝ”๋“œ ์ฒ˜๋Ÿผ ๋‚˜ ๊ฐ™์€ ํ•จ

alstn2468.github.io

 

TypeScript Study Note

๊ตฌ์กฐ์  ํƒ€์ดํ•‘ ์„ ํƒ์  ํ”„๋กœํผํ‹ฐ ์ฝ๊ธฐ์ „์šฉ ํ”„๋กœํผํ‹ฐ ์ดˆ๊ณผ ํ”„๋กœํผํ‹ฐ ๊ฒ€์‚ฌ ํ•จ์ˆ˜ ํƒ€์ž… ์ธ๋ฑ์„œ๋ธ” ํƒ€์ž… ํด๋ž˜์Šค

velog.io

 

๋• ํƒ€์ดํ•‘(Duck typing) ์ด๋ž€? :: ๋งˆ์ด๊ตฌ๋ฏธ

์ด ๊ธ€์€ ๋• ํƒ€์ดํ•‘์— ๋Œ€ํ•ด ๋‹ค๋ฃฌ๋‹ค. ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ†ตํ•ด ๋‹ค๋ฃจ์ง€๋งŒ, ๋• ํƒ€์ดํ•‘์— ๊ด€๋ จ๋œ ์šฉ์–ด๋Š” ์–ด๋Š ์–ธ์–ด๋ผ๋„ ๊ฐ™์€ ๋งฅ๋ฝ์„ ๊ฐ€์ง„๋‹ค. ์ฐธ๊ณ ํ•œ ๊ธ€์—๋Š” ์ •๋ง ๋งŽ์€ ๋ ˆํผ๋Ÿฐ์Šค๊ฐ€ ์žˆ๋‹ค. ๋ชจ๋‘ ์ฝ์–ด๋ณด๋ฉด ์ข‹

mygumi.tistory.com

 

๋ณต์‚ฌํ–ˆ์Šต๋‹ˆ๋‹ค!