๊ฐœ๋ฐœ ๊ณต๋ถ€/๋ฐ๋ธŒ์ฝ”์Šค TIL

[ํด๋ผ์šฐ๋”ฉ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์—”์ง€๋‹ˆ์–ด๋ง TIL] 240105 - JS ๋ฐ์ดํ„ฐ์™€ ํ˜•ํƒœ

๊ฐ€์šค์ด 2024. 1. 6. 23:50

Intro..


 

๋ณธ๊ฒฉ์ ์ธ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ•™์Šต์— ๋“ค์–ด๊ฐ”๋‹ค.

๊ฐ•์˜์™€ ํ•จ๊ป˜ ๋ชจ๋˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ Deep Dive ์ฑ…์„ ๋ณด๋ฉฐ ๊ณต๋ถ€ํ•˜๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์•„์„œ ์˜ค๋žœ๋งŒ์— ์ฑ…์„ ๊บผ๋ƒˆ๋‹ค.

์ž˜ ์ •๋ฆฌํ•ด๋†”์•ผ์ง€

 

 

 

์˜ค๋Š˜ ํ•™์Šตํ•œ ๋‚ด์šฉ

: ๋ฐ์ดํ„ฐ์™€ ํ˜•ํƒœ


๋ณ€์ˆ˜๋ž€?

: ๋ฉ”๋ชจ๋ฆฌ์˜ ์ฃผ์†Œ๋ฅผ ์‰ฝ๊ฒŒ ์‹๋ณ„ํ•˜๊ธฐ ์œ„ํ•ด ๋ถ™์ธ ์ด๋ฆ„

 

์ปดํ“จํ„ฐ๋Š” CPU๋กœ ์—ฐ์‚ฐ์„ ์ฒ˜๋ฆฌํ•˜๊ณ , ๋ฐ์ดํ„ฐ๋ฅผ ๊ธฐ์–ตํ•˜๊ธฐ ์œ„ํ•ด ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

๋ฉ”๋ชจ๋ฆฌ๋Š” ๊ฐ๊ฐ์˜ ์ฃผ์†Œ๋ฅผ ๊ฐ€์ง„ ๊ณต๊ฐ„์— ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋œ๋‹ค. ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋กœ ๊ฐ’์„ ์ฐธ์กฐํ•˜๊ธฐ๋Š” ์–ด๋ ค์šฐ๋‹ˆ ์‹๋ณ„์ž(๋ณ€์ˆ˜ ์ด๋ฆ„)๋ฅผ ์ง€์ •ํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๋ณ€์ˆ˜ ๋ฌธ๋ฒ•

let, const, var ํ‚ค์›Œ๋“œ๋กœ ๋ณ€์ˆ˜๋ฅผ ํ• ๋‹นํ•œ๋‹ค.

 

var

  • ์ฝ”๋“œ ํ‰๊ฐ€๋‹จ๊ณ„: ์„ ์–ธ๊ณผ ๋™์‹œ์— ๋ณ€์ˆ˜ ์ดˆ๊ธฐํ™” ์ง„ํ–‰
  • ์ฝ”๋“œ ์‹คํ–‰๋‹จ๊ณ„: ๊ฐ’ ํ• ๋‹น ์ง„ํ–‰

์ฝ”๋“œ ํ‰๊ฐ€ ์‹œ์ ์— ๋ณ€์ˆ˜ ์ดˆ๊ธฐํ™”๊ฐ€ ๋˜์–ด์žˆ์œผ๋ฏ€๋กœ, ํ• ๋‹น๋ฌธ์ด ์‹คํ–‰๋˜๊ธฐ ์ „์— ์ฐธ์กฐ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค. (ํ˜ธ์ด์ŠคํŒ…)

 

โœ… ํ˜ธ์ด์ŠคํŒ…

: ์„ ์–ธ๋ฌธ์ด ํ•ด๋‹น ์Šค์ฝ”ํ”„์˜ ์„ ๋‘๋กœ ์˜ฎ๊ฒจ์ง„ ๊ฒƒ์ฒ˜๋Ÿผ ๋™์ž‘ํ•˜๋Š” ํŠน์„ฑ

 

์˜ˆ์‹œ) ๋ณ€์ˆ˜ a๋ฅผ ์„ ์–ธํ•˜๊ธฐ ์ „์— a๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ํ˜ธ์ด์ŠคํŒ… ํŠน์„ฑ ๋•Œ๋ฌธ์— ์ด๋ฏธ ์ฝ”๋“œ ํ‰๊ฐ€๋‹จ๊ณ„์—์„œ ๋ณ€์ˆ˜ ์ดˆ๊ธฐํ™”๋ฅผ ์ง„ํ–‰ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— Error๊ฐ€ ๋‚˜์ง€ ์•Š๊ณ  ์ดˆ๊ธฐํ™”๋œ undefined๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

console.log(a) // undefined

var a

 

var์˜ ๋‹จ์ 

  • ํ‚ค์›Œ๋“œ ์ƒ๋žต ๊ฐ€๋Šฅ
  • ์ค‘๋ณต ์„ ์–ธ ๊ฐ€๋Šฅ
  • ๋ณ€์ˆ˜ ํ˜ธ์ด์ŠคํŒ…
  • ์ „์—ญ ๋ณ€์ˆ˜ํ™” -> ๋ฌด๋ถ„๋ณ„ํ•œ ๋ณ€์ˆ˜ ์ ‘๊ทผ์œผ๋กœ ์˜๋„์น˜ ์•Š์€ ๋ณ€์ˆ˜๊ฐ’ ๋ณ€๊ฒฝ์ด ์ผ์–ด๋‚  ์ˆ˜ ์žˆ๋‹ค.

 

const, let

  • ์ฝ”๋“œ ํ‰๊ฐ€๋‹จ๊ณ„: ์„ ์–ธ๋งŒ ์ง„ํ–‰
  • ์ฝ”๋“œ ์‹คํ–‰๋‹จ๊ณ„: ์ดˆ๊ธฐํ™” ์ง„ํ–‰, ๊ฐ’ ํ• ๋‹น ์ง„ํ–‰
  • ๋ธ”๋ก๋ ˆ๋ฒจ ์Šค์ฝ”ํ”„ -> var๊ณผ ๋‹ฌ๋ฆฌ ์˜ˆ์ธก ๊ฐ€๋Šฅํ•œ ๋ฒ”์œ„ ๋‚ด์—์„œ ๋ณ€์ˆ˜์˜ ๋ณ€๊ฒฝ์ด ์ผ์–ด๋‚œ๋‹ค.

const: ์ˆ˜์ • ๋ถˆ๊ฐ€๋Šฅํ•œ ์ƒ์ˆ˜ ๋ณ€์ˆ˜, ๋ณ€์ˆ˜ ์„ ์–ธํ•  ๋•Œ ๋ฌด์กฐ๊ฑด ๊ฐ’์„ ํ• ๋‹นํ•ด์•ผ ํ•œ๋‹ค.

let: ์žฌํ• ๋‹น์ด ๊ฐ€๋Šฅํ•œ ๋ณ€์ˆ˜, ๊ฐ’์„ ํ• ๋‹นํ•˜์ง€ ์•Š์•„๋„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๋ณ€์ˆ˜ ๋„ค์ด๋ฐ ์ปจ๋ฒค์…˜

  • camelCase
  • snake_case
  • PascalCase
  • CONSTANT_CASE

์ฃผ๋กœ ๋ณ€์ˆ˜๋ช…์€ camelCase๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์ƒ์„ฑ์ž, ํด๋ž˜์Šค ์ƒ์„ฑ์‹œ์— PascalCase๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

 

 

 

 

์ž๋ฃŒํ˜•์ด๋ž€?

์šฐ๋ฆฌ๋Š” ์ปดํ“จํ„ฐ์—๊ฒŒ ๋ฐ์ดํ„ฐ์˜ ์กธ๋ฅ˜๋ฅผ ์ง€์ •ํ•ด์ฃผ๊ณ , ์•Œ๋ ค์ฃผ์–ด์„œ, ๋ฐ์ดํ„ฐ ์ข…๋ฅ˜์— ๋งž๊ฒŒ ์ ํ•ฉํ•œ ๋กœ์ง ์ฒ˜๋ฆฌ๋ฅผ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

๋ฐ์ดํ„ฐ ์ข…๋ฅ˜๋ฅผ ๋ฐ์ดํ„ฐ ํƒ€์ž…, ์ž๋ฃŒํ˜•์ด๋ผ ํ•œ๋‹ค.

 

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๋ฐ์ดํ„ฐ ํƒ€์ž…

: ์›์‹œํƒ€์ž…๊ณผ ๊ฐ์ฒดํƒ€์ž…์ด ์กด์žฌํ•œ๋‹ค.

 

  • ์›์‹œ ํƒ€์ž…
    • String, Number, BigInt, undefined, Null, Boolean, Symbol
    • ๊ฐ’์€ ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€๋Šฅํ•œ ๊ฐ’์ด๋‹ค. (immutable value)
    • "๊ฐ’"์œผ๋กœ์„œ ์ „๋‹ฌ๋œ๋‹ค. (์ฐธ์กฐ ํ˜•ํƒœ X)
    • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—” ๋นŒํŠธ์ธ ๊ฐ์ฒด๋กœ ์›์‹œ ๋ž˜ํผ ๊ฐ์ฒด๊ฐ€ ๋”ฐ๋กœ ์กด์žฌํ•œ๋‹ค. 
    • ์›์‹œ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ, ํ•ด๋‹น ๋ž˜ํผ ๊ฐ์ฒด๋“ค์„ ์ƒ์†๋ฐ›์•„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

์˜ˆ์‹œ) string ๋ฐ์ดํ„ฐ ํƒ€์ž…์„ ๊ฐ€์ง„ str ๋ณ€์ˆ˜๊ฐ€ ๋งˆ์น˜ ๊ฐ์ฒด์ธ ๊ฒƒ ์ฒ˜๋Ÿผ str.length ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

let str = 'hello'
console.log(str.length) // 5

 

  • ๊ฐ์ฒด ํƒ€์ž…
    • ์›์‹œ ํƒ€์ž…์„ ์ œ์™ธํ•œ ๊ฐ’
    • ์ผ๋ฐ˜ ๊ฐ์ฒด, ํ•จ์ˆ˜, ๋‚ ์งœ, ์ธ๋ฑ์Šค ์ปฌ๋ ‰์…˜, ํ‚ค ์ปฌ๋ ‰์…˜, ...
    • ์ฐธ์กฐ ๋ฐฉ์‹์œผ๋กœ ์ „๋‹ฌ๋œ๋‹ค. (Pass By Reference)
    • ๊ฐ์ฒด๋Š” ์†์„ฑ๋“ค์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋Š” mutableํ•œ ๊ฐ’์ด๋‹ค.

 

 

์›์‹œํƒ€์ž…

  • Number
    • ์ˆซ์ž์—๋Š” ์ •์ˆ˜, ์‹ค์ˆ˜๊ฐ€ ์กด์žฌํ•จ
    • ๋‹ค๋ฅธ ์–ธ์–ด์—์„  int, long, float, double...๋“ฑ์ด ์žˆ์ง€๋งŒ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„  ํ•˜๋‚˜์˜ ์ˆซ์ž ํƒ€์ž…์ธ Number๋งŒ ์กด์žฌํ•œ๋‹ค.
    • ๋ฐฐ์ •๋ฐ€๋„ 64๋น„ํŠธ ๋ถ€๋™์†Œ์ˆ˜์ (IEEE 754) ํ˜•์‹ -> 0.1 + 0.2 !== 0.3
    • -(2^53-1) ~ (2^53-1)์˜ ์ˆ˜ → ์›์‹œ ๋ž˜ํผ๊ฐ์ฒด์—์„œ ์ƒ์ˆ˜ ๋ณ€์ˆ˜๋กœ ์ œ๊ณต (Number.MAX_SAFE_INTEGER, Number.MIN_SAFE_INTEGER)
    • infinity: ๋ฌดํ•œ๋Œ€
    • NaN: Not A Number ์ค„์ž„๋ง (์ˆซ์ž๊ฐ€ ์•„๋‹ˆ๋‹ค๋Š” ๋œป)
  • BigInt
    • ์ž„์˜ ์ •๋ฐ€๋„๋กœ ์ •์ˆ˜๋ฅผ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ˆซ์ž ์›์‹œ๊ฐ’
    • BigInt๋Š” Number์˜ ์ตœ๋Œ€๊ฐ’์„ ๋„˜๋Š” ์ •์ˆ˜๋„ ์•ˆ์ „ํ•˜๊ฒŒ ์ €์žฅํ•˜๊ณ  ์—ฐ์‚ฐํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ๋‹ค๋ฅธ ํƒ€์ž…๊ณผ ํ˜ผํ•ฉํ•˜์—ฌ ์—ฐ์‚ฐํ•  ์ˆ˜ ์—†๋‹ค.
  • String
    • UTF-16 ์ฝ”๋“œ ๋‹จ์œ„์˜ ์‹œํ€€์Šค๋กœ ํ‘œํ˜„
      • 16๋น„ํŠธ ์ •์ˆ˜๊ฐ’์˜ ์š”์†Œ๋กœ ๊ตฌ์„ฑ๋œ ์ง‘ํ•ฉ
      • ๊ฐ ์š”์†Œ๊ฐ€ string์˜ ํ•œ ์ž๋ฆฌ
      • ๋ฐฐ์—ด์ฒ˜๋Ÿผ 0๋ฒˆ์งธ index๋ถ€ํ„ฐ ์‹œ์ž‘ํ•œ๋‹ค.
    • ์›์‹œ๊ฐ’์€ ๋ถˆ๋ณ€ === ๋ฌธ์ž๊ฐ’์€ ๋ถˆ๋ณ€
    • "". `` ๋ฅผ ์‚ฌ์šฉ
let a = 'test'
console.log(`Hi, this is ${a}`)

 

  • Boolean
    • ์ฐธ ํ˜น์€ ๊ฑฐ์ง“
  • undefined
    • ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•œ ํ›„ ๊ฐ’์„ ํ• ๋‹นํ•˜์ง€ ์•Š์€ ๋ณ€์ˆ˜์— ํ• ๋‹น์ด ๋˜๋Š” ๊ฐ’
    • ๊ฐœ๋ฐœ์ž๊ฐ€ ์˜๋„ํ•ด์„œ ๋„ฃ์„ ์ˆ˜ ์žˆ๋‹ค.
  • null
    • ๊ฐ’์ด ์—†๋‹ค๋Š” ๊ฒƒ์„ ์˜๋„์ ์œผ๋กœ ํ‘œํ˜„ํ•  ๋•Œ
    • ์ด์ „์— ์ฐธ์กฐ๋˜์—ˆ๋˜ ๊ฐ’์„ ์˜๋„์ ์œผ๋กœ ๋”์ด์ƒ ์ฐธ์กฐํ•˜์ง€ ์•Š๊ฒ ๋‹ค๋Š” ์˜๋ฏธ
typeof null; // 'object'

// null์˜ ํƒ€์ž…์€ ์˜ค๋ธŒ์ ํŠธ๋ผ ์ผ์น˜ ์—ฐ์‚ฐ์ž๋กœ ์ฒดํฌํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Œ
const foo = null;
foo === null; // true

 

  • Symbol
    • ES6์— ์ถ”๊ฐ€๋œ ํƒ€์ž…
    • ์ค‘๋ณต๋˜์ง€ ์•Š์€ ์œ ๋‹ˆํฌํ•œ ๊ฐ’
    • ๊ฐ์ฒด์˜ key๋กœ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋‹ค.
    • ํด๋ž˜์Šค๋‚˜ ๊ฐ์ฒด ํ˜•์‹์˜ ๋‚ด๋ถ€์—์„œ๋งŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ์ „์šฉ ๊ฐ์ฒด ์†์„ฑ์˜ ํ‚ค๋กœ ์‚ฌ์šฉ
    • Symboleํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์ƒ์„ฑํ•œ๋‹ค.

 

๊ฐ์ฒด ํƒ€์ž… (Reference Type)

: ๋‹ค์–‘ํ•œ ํƒ€์ž…์˜ ๊ฐ’์„ ํ•˜๋‚˜์˜ ๋‹จ์œ„๋กœ ๊ตฌ์„ฑํ•œ ๋ณตํ•ฉ์ ์ธ ์ž๋ฃŒ๊ตฌ์กฐ

์›์‹œ ํƒ€์ž…์„ ์ œ์™ธํ•œ ๋ชจ๋“  ๊ฒƒ์ด ๊ฐ์ฒด ํƒ€์ž…

  • mutable: ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•œ ๊ฐ’ (์›์‹œ: immutable)
  • ํž™ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ: ๋™์ ์œผ๋กœ ๋ณ€ํ™”๊ฐ€๋Šฅ, ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„ ํ™•๋ณด ๋ฐ ์ €์žฅ
  • pass-by-reference (์ฐธ์กฐ์— ์˜ํ•œ ์ „๋‹ฌ)

 

 

๋™์  ํƒ€์ž… ์–ธ์–ด

: ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ๋™์  ํƒ€์ž… ์–ธ์–ด์ด๋ฉฐ, ์˜๋„์ ์œผ๋กœ ํƒ€์ž…์„ ๋ณ€ํ™˜ํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ ์˜๋„์™€ ์ƒ๊ด€์—†์ด ๋ณ€๊ฒฝ๋˜๊ธฐ๋„ ํ•œ๋‹ค.

  • ๋ช…์‹œ์  ํƒ€์ž… ๋ณ€ํ™˜
    • ๊ฐ’.toString()
    • Number(๊ฐ’)
    • Boolean(๊ฐ’)
  • ์•”๋ฌต์  ํƒ€์ž… ๋ณ€ํ™˜
    • ๊ฐ’ + "": ๋ฌธ์ž์—ด ํƒ€์ž…์œผ๋กœ ๋ณ€ํ™˜
    • ๊ฐ’ * 1: ์ˆซ์ž ํƒ€์ž…์œผ๋กœ ๋ณ€ํ™˜
    • !!๊ฐ’: ๋ถˆ๋ฆฌ์–ธ ํƒ€์ž…์œผ๋กœ ๋ณ€ํ™˜

๊ฐ’์ด ์ „๋‹ฌ๋  ๋•Œ, ๊ฐœ๋ฐœ์ž ์˜๋„์™€ ๋‹ค๋ฅด๊ฒŒ ์•”๋ฌต์  ํƒ€์ž… ๋ณ€ํ™˜์ด ์ผ์–ด๋‚  ์ˆ˜ ์žˆ์–ด ํƒ€์ž… ์ถ”๋ก ์ด ์–ด๋ ค์›Œ์ ธ ๋ถˆํ•„์š”ํ•œ ๋””๋ฒ„๊น… ์‹œ๊ฐ„์ด ๋ฐœ์ƒ๋œ๋‹ค.

์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด, ์ „๋‹ฌ๋˜๋Š” ์‹œ์ ๋งˆ๋‹ค typeof๋‚˜ ์ผ์น˜ ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•ด ํƒ€์ž… guard๋ฅผ ๊ตฌํ˜„ํ•˜๊ฑฐ๋‚˜ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

 

 

 

๋งˆ๋ฌด๋ฆฌ


๋ถˆ๊ธˆ์ด๋ผ ์–ผ๋ฅธ ๊ณต๋ถ€๋ฅผ ๋๋‚ด๊ณ  ์‹ถ์€ ๋งˆ์Œ์— ๊ธˆ์š”์ผ์— ๊ฐ•์˜๋ฅผ ๋“ฃ๊ณ  ๋ฐ”๋กœ TIL์„ ์ž‘์„ฑํ•˜์ง€ ์•Š๊ณ  ๋ฏธ๋ค„์„œ ๋‹ค์Œ๋‚ ์— ์ž‘์„ฑํ–ˆ๋‹ค.

TIL์˜ ์˜๋ฏธ๊ฐ€ ์กฐ๊ธˆ ์‚ฌ๋ผ์ง„ ๊ฒƒ ๊ฐ™์•„ ๋‹ค์‹œ ์˜ค๋Š˜ ํ•˜๋ฃจ ๋ฐฐ์šด ๊ฒƒ์„ ๋‹น์ผ์— ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ๋…ธ๋ ฅํ•ด์•ผ๊ฒ ๋‹ค.