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

[ํด๋ผ์šฐ๋”ฉ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์—”์ง€๋‹ˆ์–ด๋ง TIL] 240109 - JS ๊ฐ์ฒด, ๋นŒํŠธ์ธ ๊ฐ์ฒด

๊ฐ€์šค์ด 2024. 1. 9. 22:48

Intro


์˜ค๋Š˜์€ ์ธํ’‹์ด ๋„ˆ๋ฌด ๋„ˆ๋ฌด ๋งŽ์€ ๋‚ ์ด์—ˆ๋‹ค.

๊ฐ•์˜๋„ ์—„์ฒญ ๋งŽ๊ณ .. ํ”„๋กœํ† ํƒ€์ž…์ด๋ž‘ ์Šค์ฝ”ํ”„, ์‹คํ–‰ ์ปจํ…์ŠคํŠธ ๋“ฑ๋“ฑ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ์—„์ฒญ ์ค‘์š”ํ•œ ํŠน์ง•๋“ค์„ ๋‹ค ๋ฐฐ์› ๋‹ค. ํ•˜๋ฃจ๋งŒ์—...

๊ฑฐ๊ธฐ๋‹ค๊ฐ€ Github A to Z ํŠน๊ฐ•๊นŒ์ง€ ๋“ค์–ด์„œ ์กฐ๊ธˆ ๋นก์…Œ๋‹ค. ใ… ใ… 

 

 

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

: ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ > ๊ฐ์ฒด์™€ ๋นŒํŠธ์ธ ๊ฐ์ฒด ๊ทธ๋ฆฌ๊ณ  ๋งค์ปค๋‹ˆ์ฆ˜


๊ฐ์ฒด

ํ”„๋กœํ† ํƒ€์ž… ๊ธฐ๋ฐ˜ ๊ฐ์ฒด์ง€ํ–ฅ ์–ธ์–ด์ธ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ๊ฐ์ฒด๋Š” ๋งค์šฐ ์ค‘์š”ํ•˜๋‹ค.

๊ฐ์ฒด๋ž€, ์†์„ฑ์„ ๊ฐ€์ง„ ๋…๋ฆฝ์ ์ธ ๊ฐœ์ฒด (์†์„ฑ์œผ๋กœ ๊ตฌ์„ฑ๋œ ์ง‘ํ•ฉ)์ด๋‹ค.

 

โš ๏ธ ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ

๊ฐ์ฒด๋ผ๋Š” ๊ธฐ๋ณธ ๋‹จ์œ„๋กœ ๋‚˜๋ˆ„๊ณ  ์ด๋“ค์˜ ์ƒํ˜ธ์ž‘์šฉ์œผ๋กœ ์„œ์ˆ ํ•˜๋Š” ๋ฐฉ์‹

์‹ค์„ธ๊ณ„์— ์กด์žฌํ•˜๊ณ  ์ธ์ง€ํ•˜๊ณ  ์žˆ๋Š” ๊ฐ์ฒด(Object)๋ฅผ ์†Œํ”„ํŠธ์›จ์–ด์˜ ์„ธ๊ณ„์—์„œ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ๊ฐ์ฒด์˜ ํ•ต์‹ฌ์ ์ธ ๊ฐœ๋… ๋˜๋Š” ๊ธฐ๋Šฅ๋งŒ์„ ์ถ”์ถœํ•˜๋Š” ์ถ”์ƒํ™”(abstraction)๋ฅผ ํ†ตํ•ด ๋ชจ๋ธ๋งํ•˜๋ ค๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํŒจ๋Ÿฌ๋‹ค์ž„ - poiemaweb

 

๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—๋Š” ํด๋ž˜์Šค ๊ธฐ๋ฐ˜ ์–ธ์–ด์™€ ํ”„๋กœํ† ํƒ€์ž… ๊ธฐ๋ฐ˜ ์–ธ์–ด๊ฐ€ ์žˆ๋Š”๋ฐ ๋Œ€ํ‘œ์ ์ธ ํด๋ž˜์Šค ๊ธฐ๋ฐ˜ ์–ธ์–ด๋Š” Java, C++ ๋“ฑ์ด ์žˆ๊ณ  ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ํ”„๋กœํ† ํƒ€์ž… ๊ธฐ๋ฐ˜ ์–ธ์–ด์— ์†ํ•œ๋‹ค.

 

๊ฐ์ฒด ์†์„ฑ

: ํ‚ค์™€ ๊ฐ’ ์‚ฌ์ด์˜ ์—ฐ๊ฒฐ๊ด€๊ณ„ (key-value)

  • ์†์„ฑ ์ ‘๊ทผ ๋ฐฉ๋ฒ•
    • objectName.prototypeName
    • objectName["prototypeName"]

โ—๏ธ์†์„ฑ์—๋Š” ๊ฐ’ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ํ•จ์ˆ˜๋„ ํ• ๋‹น ๊ฐ€๋Šฅ

 

๊ฐ์ฒด ์ƒ์„ฑ ๋ฐฉ๋ฒ•

  • ๋ฆฌํ„ฐ๋Ÿด ํ‘œ๊ธฐ๋ฒ•
const foo = { name: 'apple' }
  • ์ƒ์„ฑ์ž ํ•จ์ˆ˜
    • ์†์„ฑ๋งŒ ๊ฐ™๊ณ  ๊ฐ’์ด ๋‹ค๋ฅธ ๊ฐ์ฒด๋ฅผ ์—ฌ๋Ÿฌ๊ฐœ ์ƒ์„ฑํ•  ๋•Œ
    • ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•œ ํ›„, ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๊ฐ์ฒด ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
function Person(name, age) {
  this.name = name
  this.age = age
}

new Person('gayeon', 29)
  • Object.create
    • ์ƒ์„ฑ์ž ํ•จ์ˆ˜์ฒ˜๋Ÿผ ๋™์ผํ•œ ์†์„ฑ๊ฐ’์„ ๊ฐ–๋Š” ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๊ฐ์ฒด ์†์„ฑ ์ปจํŠธ๋กค

๊ฐ์ฒด๋Š” ์ฐธ์กฐ ํ˜•ํƒœ๋กœ ์ „๋‹ฌ๋˜๋ฉฐ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•œ ๊ฐ’์ด๋‹ค.

โžก๏ธ ์ด๋Š” ๊ฐ์ฒด ๋ณ€๊ฒฝ์ด ์ผ์–ด๋‚  ๋•Œ ์ฐธ์กฐ๋œ ๊ฐ์ฒด๋“ค๋„ ๊ฐ™์ด ๋ณ€๊ฒฝ๋˜๋Š” ๋ฌธ์ œ์ ์„ ์•ผ๊ธฐํ•œ๋‹ค. (์ฐธ์กฐ ํ˜•ํƒœ๋กœ ๊ฐ™์€ ์ฃผ์†Œ๊ฐ’์„ ๋ฐ”๋ผ๋ณด๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ) ๋•Œ๋ฌธ์— ์˜๋„ํ•œ ๋™์ž‘์ด ๋˜๊ธฐ ์œ„ํ•ด ์ ์ ˆํ•œ ์กฐ์ž‘์ด ํ•„์š”ํ•˜๋‹ค.

  • ๋™์  ์ƒ์„ฑ
    • ๊ฐ์ฒด์˜ ์กด์žฌํ•˜์ง€ ์•Š๋Š” ์†์„ฑ์„ ์ฐธ์กฐํ•˜๊ณ  ํ• ๋‹น๋ฌธ์„ ํ†ตํ•ด ๊ฐ’์„ ํ• ๋‹นํ•˜๋ฉด ์†์„ฑ์ด ๋™์ ์œผ๋กœ ์ƒ์„ฑ๋˜๊ณ  ์ถ”๊ฐ€๋จ
const person = {
  name: 'gayeon',
  age: 25,
}

person.gendor = 'w'; // ๋™์  ์ƒ์„ฑ
  • ๊ฐ์ฒด ์†์„ฑ ๋‚˜์—ด
    • for...in
    • Object.keys(๊ฐ์ฒด)
    • Object.getOwnPropertyNames(๊ฐ์ฒด)
function Person(name, age) {
  this.name = name
  this.age = age
}

const gayeon = new Person('gayeon', 29)

for(key in gayeon) {
  console.log(key)
} /* 
name
age
*/

Object.keys(gayeon) // ['name', 'age']
Object.getOwnPropertyNames // ['name', 'age']
  • ๊ฐ์ฒด ์†์„ฑ ์‚ญ์ œ (delete ํ‚ค์›Œ๋“œ)
function Person(name, age) {
  this.name = name
  this.age = age
}

const gayeon = new Person('gayeon', 29)
delete gayeon.name // true
console.log(gayeon) // Person { age: 29 }

 

 

๊ฐ์ฒด ๋น„๊ต์™€ ๋ณต์‚ฌ

๊ฐ์ฒด ๋น„๊ต

: ๊ฐ์ฒด๋ฅผ ์„œ๋กœ ๋น„๊ตํ•˜๋ฉด ์†์„ฑ๊ณผ ๊ฐ’์ด ๊ฐ™์•„๋„ ์ฐธ์กฐ๊ฐ’์ด ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— false๊ฐ€ ๋‚˜์˜จ๋‹ค.

๋™์ผํ•œ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ด์•ผ ํ•  ๋•Œ ์ •์˜๋œ ๊ฐ์ฒด๋ฅผ ๋‹ค๋ฅธ ๋ณ€์ˆ˜์— ๊ทธ๋Œ€๋กœ ํ• ๋‹นํ•  ๊ฒฝ์šฐ, ๋™์ผํ•œ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋งŒ ํ• ๋‹น๋˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜๋ฉด ๋‹ค๋ฅธ ๋ณ€์ˆ˜์˜ ๊ฐ’๋„ ๋ณ€๊ฒฝ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ์ฒด ๋ณต์‚ฌ๋ฅผ ํ†ตํ•ด ๊ตฌํ˜„ํ•ด์•ผ ํ•œ๋‹ค.

const obj = { a: 'a', b: 'b', c: 3 }
const obj2 = { a: 'a', b: 'b', c: 3 }
const obj3 = obj

obj === obj2 // false
obj === obj3 // true

obj.a = 'aaa'
console.log(obj3) // {a: 'aaa', b: 'b', c: 3}

 

๊ฐ์ฒด ๋ณต์‚ฌ์˜ 2๊ฐ€์ง€ ๋ฐฉ๋ฒ•

  • ์–•์€ ๋ณต์‚ฌ
    • ๊ฐ์ฒด ์†์„ฑ ์ค‘ ์ฐธ์กฐ ํƒ€์ž…์ด ์—†๋Š” ๊ฒฝ์šฐ ์–•์€ ๋ณต์‚ฌ ๋ฐฉ๋ฒ• ๊ถŒ์žฅ
    • Object.assign({}, ๋ณต์‚ฌํ•  ๊ฐ์ฒด)
    • spread ์—ฐ์‚ฐ์ž { ...๋ณต์‚ฌ ๊ฐ์ฒด }
const obj = { a: 'a', b: 'b', c: 3 }
const obj2 = Object.assign({}, obj)
const obj3 = { ...obj } 

obj2 // { a: 'a', b: 'b', c: 3 }
obj3 // { a: 'a', b: 'b', c: 3 }

obj === obj2 // false
obj === obj3 // false
  • ๊นŠ์€ ๋ณต์‚ฌ
    • ๋ณต์‚ฌ๋œ ๊ฐ์ฒด ์†์„ฑ ์ค‘ ํ•˜๋‚˜๋ผ๋„ ์ฐธ์กฐ๋ฅผ ํ•˜๊ณ  ์žˆ๋Š” ์†์„ฑ์ด ์—†๋‹ค๋ฉด ๊นŠ์€ ๋ณต์‚ฌ๋กœ ๋ณต์‚ฌ๋˜์—ˆ๋‹ค๊ณ  ํ•œ๋‹ค.
    • ๊นŠ์€ ๋ณต์‚ฌ ๋ฐฉ๋ฒ•
      • ์žฌ๊ท€ ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•œ ๋ณต์‚ฌ (์ถ”์ฒœ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ: lodash - cloneDeep)
      • JSON.stringify: ๊ฐ์ฒด -> ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜ -> ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ (JSON.parse)  ๊ถŒ์žฅํ•˜์ง€ ์•Š๋Š” ๋ฐฉ์‹

 

๊ฐ์ฒด ์ข…๋ฅ˜

  1. ํ‘œ์ค€ ๋นŒํŠธ์ธ ๊ฐ์ฒด ECMAScript
  2. ํ˜ธ์ŠคํŠธ ๊ฐ์ฒด (๋ธŒ๋ผ์šฐ์ € ๊ธฐ์ค€) DOM API

 

 ํ‘œ์ค€ ๋นŒํŠธ์ธ ๊ฐ์ฒด ECMAScript 

๊ธฐ๋ณธ์ ์œผ๋กœ Object ๊ฐ์ฒด ์†์„ฑ์„ ์ƒ์† ๋ฐ›๋Š”๋‹ค. โžก๏ธ ํ”„๋กœํ† ํƒ€์ž… ๋ฉ”์„œ๋“œ๋“ค์„ ๋ชจ๋‘ ์ƒ์† (toString(), toLocaleString(), valueOf()..)

  • ๊ธฐ์ดˆ ๊ฐ์ฒด: Object, Function, Boolean, Symbol
  • ์˜ค๋ฅ˜ ๊ฐ์ฒด: Error
  • ์ˆซ์ž ๋ฐ ๋‚ ์งœ: Number, BigInt, Math, Date
  • ํ…์ŠคํŠธ ์ฒ˜๋ฆฌ: Regex, String
  • Collection: Array, Map, Set ...
  • ๊ตฌ์กฐํ™”๋œ ๋ฐ์ดํ„ฐ: JSON
  • ์ œ์–ด ์ถ”์ƒํ™” ๊ฐ์ฒด (Promise, Generator, AsyncFunction, ...)

 

Date์™€ UTC

Date๊ฐ์ฒด๋Š” 1970๋…„ 1์›” 1์ผ UTC ์ž์ •๊ณผ์˜ ์‹œ๊ฐ„ ์ฐจ์ด๋ฅผ ๋ฐ€๋ฆฌ์ดˆ ๋‹จ์œ„๋กœ ๋‚˜ํƒ€๋‚ธ ๊ฒƒ์ด๋‹ค.

 

โœ… UTC

  • Universal Time Coordinated ๊ตญ์ œ ํ‘œ์ค€ ์‹œ๊ฐ„์˜ ํ˜‘์ • ์„ธ๊ณ„์‹œ
  • ๊ตญ์ œ์ ์ธ ํ‘œ์ค€ ์‹œ๊ฐ„์˜ ๊ธฐ์ค€์œผ๋กœ ์“ฐ์ด๋Š” ์‹œ๊ฐ
  • ์ธํ„ฐ๋„ท, WWW, ํ•ญ๊ณต ๋“ฑ์—์„œ ์‚ฌ์šฉ๋œ๋‹ค.
  • ํ•œ๊ตญ์€ UTC๊ธฐ์ค€์œผ๋กœ +9์‹œ๊ฐ„

โœ… ๋‚ ์งœ ํ‘œ๊ธฐ์™€ ISO 8601

  • ISO ๊ตญ์ œ ํ‘œ์ค€ํ™” ๊ธฐ๊ตฌ์—์„œ ๋‚ ์งœ๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ๋ฐฉ์‹์„ ํ‘œ์กดํ™” ํ•˜์˜€๋‹ค.
  • ISO 8601
    • YYYY-MM-SSTHH:mm:ssZ (๋งŽ์ด ์‚ฌ์šฉ)
    • ํ˜ผํ•ฉ๋œ ์ผ์‹œ ํ‘œํ˜„ ์‹œ T ๊ตฌ๋ถ„์ž ์‚ฌ์šฉ
    • UTC ๋‚ ์งœ๋ผ๋Š” ์˜๋ฏธ๋กœ Z ํ‘œํ˜„

 

์ •๊ทœ ํ‘œํ˜„์‹

: ๋ฌธ์ž์—ด์—์„œ ํŠน์ • ๋ฌธ์ž ์กฐํ•ฉ์„ ์ฐพ๊ธฐ ์œ„ํ•œ ํŒจํ„ด

/pattern/flags (ex. /\w+\s/g)

 

์ •๊ทœ ํ‘œํ˜„์‹ ์ƒ์„ฑ ๋ฐฉ๋ฒ•

  • ๋ฆฌํ„ฐ๋Ÿด ํ‘œ๊ธฐ๋ฒ•: ์ •๊ทœ์‹์ด ๋ณ€ํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ๋ฆฌํ„ฐ๋Ÿด ํ‘œ๊ธฐ๋ฒ•์„ ์‚ฌ์šฉ
  • RegExp ๊ฐ์ฒด
    • ๋Ÿฐํƒ€์ž„ ๋•Œ ์ปดํŒŒ์ผ ๋˜๋ฉฐ ํŒจํ„ด์ด ๋ณ€ํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๊ฑฐ๋‚˜ ์•Œ์ˆ˜ ์—†๋Š” ๋ฐ์ดํ„ฐ์—์„œ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒฝ์šฐ ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•จ
    • new RegExp(/pattern/, flag)

 

โœ… ์ •๊ทœํ‘œํ˜„์‹ ํ”Œ๋ž˜๊ทธ(flag) ์ข…๋ฅ˜

  • d: dotAll
  • g: global
  • i: ignore case
  • m: multiline
  • s: souce
  • y: sticky
  • u: unicode

 

 

Collection

: ๋ฐ์ดํ„ฐ ํ•ญ๋ชฉ๋“ค์˜ ๊ทธ๋ฃน์„ ์˜๋ฏธ (list, set, tree, graph ๋“ฑ์ด ํฌํ•จ๋˜์–ด ์žˆ๋‹ค.)

โœ… ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ Collection

  • Indexed Collections
    • Index ๊ฐ’์„ ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌ๋œ ๋ฐ์ดํ„ฐ ์ง‘ํ•ฉ โžก๏ธ Array, TypedArray
  • Keyed Collections
    • Key ๊ฐ’์„ ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌ๋˜์–ด ์žˆ๋Š” ๋ฐ์ดํ„ฐ ์ง‘ํ•ฉ โžก๏ธ Map, Set
    • ํ‚ค์™€ ๊ฐ’์„ ๋งคํ•‘ํ•˜์—ฌ ์ €์žฅ
    • ์ €์žฅ๋œ ์ˆœ์„œ๋Œ€๋กœ ๊ฐ ์š”์†Œ๋“ค์„ ๋ฐ˜๋ณต์ ์œผ๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.

 

Indexed Collections - Array

  • 1๊ฐœ์˜ ๋ณ€์ˆ˜์— ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๊ฐ’์„ ์ˆœ์ฐจ์ ์œผ๋กœ ์ €์žฅํ•  ๋•Œ ์‚ฌ์šฉ
  • 0๊ฐœ ์ด์ƒ์˜ ์‹ ๋ชฉ๋ก
  • ๊ธธ์ด๋Š” ๊ณ ์ •๋˜์–ด ์žˆ์ง€ ์•Š๊ณ  ๋ชจ๋“  ์š”์†Œ๋Š” ํ•„์ˆ˜๊ฐ’์ด ์•„๋‹ˆ๋‹ค. (undefined ์‚ฌ์šฉ ๊ฐ€๋Šฅ)
  • ๋ฐฐ์—ด ์ƒ์„ฑ ๋ฐฉ๋ฒ•
    • []
    • new Array(arrayLength)
    • new Array(element0, element1, ...)
  • index๋กœ ์ฐธ์กฐํ•˜๋ฉฐ 0๋ถ€ํ„ฐ ์‹œ์ž‘ํ•œ๋‹ค. (๋ฐฐ์—ด์˜ ๊ธธ์ด = ๋ฐฐ์—ด์˜ ๋งˆ์ง€๋ง‰ index + 1)
  • index ๊ฐ’์„ ์†์„ฑ ์ด๋ฆ„์œผ๋กœ ์‚ฌ์šฉํ•ด ํ‘œ์ค€ ๊ฐ์ฒด์˜ ์†์„ฑ์ฒ˜๋Ÿผ ์ €์žฅํ•œ๋‹ค.
  • for, forEach๋กœ ๋ฐฐ์—ด ๋ฐ˜๋ณต

 

Key based Collections - Map, WeakMap, Set, WeakSet

Map, WeakMap

: ํ‚ค์™€ ๊ฐ’์„ ๋งคํ•‘์‹œ์ผœ ์ €์žฅํ•œ๋ฉฐ key๋Š” unique

  • Map: ๊ฐ„๋‹จํ•œ ํ‚ค์™€ ๊ฐ’์„ ์„œ๋กœ ๋งคํ•‘์‹œ์ผœ ์ €์žฅํ•˜๊ณ  ์ €์žฅ๋œ ์ˆœ์„œ๋Œ€๋กœ ์š”์†Œ๋ฅผ ๋ฐ˜๋ณต์ ์œผ๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.
  • WeakMap: ํ‚ค์— ๋Œ€ํ•œ ๊ฐ•๋ ฅํ•œ ์ฐธ์กฐ๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š๋Š” ํ‚ค/๊ฐ’ ์Œ์˜ ๋ชจ์Œ์œผ๋กœ ํ‚ค๋Š” object๋งŒ ํ™œ์šฉํ•œ๋‹ค. ๊ฐ์ฒด ์ •๋ณด๋ฅผ ๋น„๋…ธ์ถœํ•˜๋Š” ํŠน์ง•์ด ์žˆ์–ด ๊ฐ์ฒด์˜ ์‚ฌ์ ์ธ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๊ณ  ์ƒ์„ธ ๊ตฌํ˜„๋‚ด์šฉ์„ ์ˆจ๊ธฐ๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•œ๋‹ค.

โœ… Map VS Object

  Object Map
์†์„ฑ์˜ ๋ฐ์ดํ„ฐ ํƒ€์ž… ํ‚ค๋กœ string, Symbol ํƒ€์ž…๋งŒ ๊ฐ€๋Šฅ ๋ชจ๋“  ๊ฐ’์„ ํ‚ค๋กœ ํ™œ์šฉ
default ์†์„ฑ๊ณผ์˜ ์ถฉ๋Œ Object prototype์˜ ๊ธฐ๋ณธ ์†์„ฑ๊ณผ ๋™์ผํ•œ ํ‚ค ์ƒ์„ฑ ์‹œ ์ถฉ๋Œ ๊ธฐ๋ณธ ์†์„ฑ์ด ์—†์–ด ์ถฉ๋Œ X
๊ฐ์ฒด ํฌ๊ธฐ ์ˆ˜๋™ ์ถ”์  size ์ธ์Šคํ„ด์Šค ์†์„ฑ์œผ๋กœ ํ™•์ธ ๊ฐ€๋Šฅ
์ˆœ์„œ ๋ณด์žฅ X O
iterable X O (foreach ์ œ์–ด๋ฌธ ์‚ฌ์šฉ ๊ฐ€๋Šฅ)
ํผํฌ๋จผ์Šค ๋œ ์ข‹์Œ ์ข‹์Œ
์ง๋ ฌํ™” ๊ตฌ๋ฌธ๋ถ„์„ ์ œ๊ณต O X

 

 

Set, WeakSet

: ๋ฐฐ์—ด์„ ์ธ์ž๋กœ ๋ฐ›์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ค‘๋ณต๋œ ๊ฐ’์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.

  • Set
    • ๋ชจ๋“  ๊ฐ’๋“ค์˜ ์ง‘ํ•ฉ
    • ์ž…๋ ฅ๋œ ์ˆœ์„œ์— ๋”ฐ๋ผ ์ €์žฅ๋œ ์š”์†Œ๋ฅผ ๋ฐ˜๋ณต ์ฒ˜๋ฆฌ
    • NaN์€ Set์—์„œ ๊ฐ™์€ ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผํ•จ
    • ๋ฐฐ์—ด -> Set, Set -> ๋ฐฐ์—ด๋กœ ๋ณ€ํ™˜ ๊ฐ€๋Šฅํ•˜๋ฉฐ, for...of๋ฅผ ํ†ตํ•ด ์ˆœํšŒ ๊ฐ€๋Šฅํ•˜๋‹ค.
  • WeakSet
    • ๊ฐ์ฒด ์ปฌ๋ ‰์…˜ (object ๊ฐ’๋งŒ์„ ํ—ˆ์šฉ)
    • ์•ฝํ•œ ์ฐธ์กฐ๋ฅผ ๊ฐ€์ง
const foo = new WeakSet()
foo.add({ foo: 1 })

 

โœ… Set VS Array

  Array Set
ํฌํ•จ ์—ฌ๋ถ€ ํ™•์ธ ํผํฌ๋จผ์Šค indexOf (ํผํฌ๋จผ์Šค ๋А๋ฆผ) has ๋ฉ”์„œ๋“œ
์š”์†Œ ์ œ๊ฑฐ ์š”์†Œ ์ œ๊ฑฐํ•˜๋ฉด ๋ฐฐ์—ด์„ ์ž˜๋ผ๋‚ด์•ผ ํ•จ delete ๋ฉ”์„œ๋“œ
์š”์†Œ ์ฐพ๊ธฐ NaN์€ indexOf ํฌํ•จ์—ฌ๋ถ€๋ฅผ ํ™•์ธ ๋ถˆ๊ฐ€ํ•จ Set์€ ํ™•์ธ ๊ฐ€๋Šฅ
์ค‘๋ณต ์—ฌ๋ถ€ ํ™•์ธ ์ˆœํšŒํ•˜๋ฉฐ ํ™•์ธํ•ด์•ผ ํ•œ๋‹ค. ์ค‘๋ณต ๋ถˆ๊ฐ€๊ฐ€ ๊ธฐ๋ณธ

 

 

JSON (JavaScript Object Notation) ๊ฐ์ฒด

: ์ธํ„ฐ๋„ท์—์„œ ์ž๋ฃŒ๋ฅผ ์ฃผ๊ณ ๋ฐ›์„ ๋•Œ ์ž๋ฃŒ๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ์•Œ๋ ค์ ธ ์žˆ์Œ

  • ํ‚ค-๊ฐ’ ์Œ, ๋ฐฐ์—ด ์ž๋ฃŒํ˜•, ํ‚คํƒ€ ๋ชจ๋“  ์ง๋ ฌํ™” ๊ฐ€๋Šฅํ•œ ๊ฐ’์œผ๋กœ ์ด๋ฃจ์–ด์ง„ ๋ฐ์ดํ„ฐ ๊ฐ์ฒด๋ฅผ ์ „๋‹ฌํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ๋žŒ์ด ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ํ…์ŠคํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” open standard ํฌ๋งท
  • ํ™•์žฅ์ž: .json
  • ๊ฐ์ฒด ํ˜•ํƒœ์™€ ์œ ์‚ฌํ•˜๋‹ค.
  • ์ƒ์„ฑ์ž ํ•จ์ˆ˜๊ฐ€ ์•„๋‹ˆ๋ฉฐ, ํ•จ์ˆ˜๋กœ์„œ ์‚ฌ์šฉ ๋ถˆ๊ฐ€ํ•˜๋‹ค.

โš ๏ธ ๋ฌธ์ž์—ด์ด ๊ฐ์ฒด ํ˜•ํƒœ๊ฐ€ ์•„๋‹ ๊ฒฝ์šฐ, ์˜ค๋ฅ˜ ๋ฐœ์ƒ -> try...catch๋ฌธ์œผ๋กœ ์—๋Ÿฌ ํ•ธ๋“ค๋ง ๊ถŒ์žฅ โš ๏ธ

 

๐Ÿ“Œ ์ง๋ ฌํ™” (serialization), ์—ญ์งˆ๋ ฌํ™” (deserialization)

  • ์ง๋ ฌํ™”: Object โžก๏ธ ๋ฌธ์ž์—ด (JSON.stringify)
  • ์—ญ์งˆ๋ ฌํ™”: ๋ฌธ์ž์—ด โžก๏ธ Object (JSON.parse)

 

๊ตญ์ œํ™” (intl ๊ฐ์ฒด)

: ๊ฐ ์–ธ์–ด์— ๋งž๋Š” ๋ฌธ์ž, ์ˆซ์ž, ์‹œ๊ฐ„, ๋‚ ์งœ ๋น„๊ต๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ตญ์ œํ™” API๋ฅผ ์œ„ํ•œ ๋„ค์ž„์ŠคํŽ˜์ด์Šค

  • DateTimeFormat
  • NumberFormat

 

 

 ํ”„๋กœํ† ํƒ€์ž… ๊ธฐ๋ฐ˜ ์–ธ์–ด 

โš ๏ธ ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด

  • ๊ฐ์ฒด์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“œ๋Š” ๋ถ€๋ชจ ๊ฐ์ฒด ๊ฒŒ๋…
  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๋ชจ๋“  ๊ฐ์ฒด๋Š” ๋ถ€๋ชจ ๊ฐ์ฒด์ธ ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด์™€ ์—ฐ๊ฒฐ
  • ๋ถ€๋ชจ๊ฐ์ฒด์˜ ์†์„ฑ๊ณผ ๋ฉ”์„œ๋“œ๋ฅผ ์ƒ์†๋ฐ›์•„ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด ์ ‘๊ทผํ•˜๊ธฐ

  • ๋ชจ๋“  ๊ฐ์ฒด๋Š” [[Prototype]] ์ธํ„ฐ๋„ ์Šฌ๋กฏ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

  • __proto__๋ผ๋Š” ์ ‘๊ทผ์ž ์†์„ฑ์œผ๋กœ Object.prototype ๊ฐ์ฒด์— ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•จ

 

ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด ์ƒ์„ฑํ•˜๊ธฐ

  • ํ•จ์ˆ˜ ํƒ€์ž…์—๋งŒ ์กด์žฌํ•˜๋Š” prototype ํ•„๋“œ
  • ํ•จ์ˆ˜๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋ถ€๋ชจ๊ฐ์ฒด์˜ ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ ๊ฐ€๋Šฅ
  • ์ธ์Šคํ„ด์Šค ๋ถ€๋ชจ๊ฐ์ฒด == ์ƒ์„ฑ์žํ•จ์ˆ˜.prototype

 

ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ธ (chain)

  • ๊ฐ์ฒด ์†์„ฑ ์ฐธ์กฐ์‹œ, ์†์„ฑ์ด ์—†๋Š” ๊ฒฝ์šฐ ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ธ์ด ๋™์ž‘ํ•จ
  • ๋ชจ๋“  ๊ฐ์ฒด์˜ ๋ถ€๋ชจ๋Š” Object.prototype โžก๏ธ End of Prototype chain
  • ๋งŒ์•ฝ ๋งˆ์ง€๋ง‰ ๋ถ€๋ชจ๊ฐ์ฒด์—์„œ๊นŒ์ง€ ํ•ด๋‹น ์†์„ฑ์„ ์ฐพ์ง€ ๋ชปํ•  ๊ฒฝ์šฐ, Undefined

 

ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด ํ™•์žฅ๊ณผ ์†์„ฑ

  • prototype ๊ฐ์ฒด ์†์„ฑ๊ณผ ๋ฉ”์„œ๋“œ ์ •์˜ ์‹œ ์ธ์Šคํ„ด์Šค ๊ฐ์ฒด์—์„œ ๋ถ€๋ชจ ๋ฉ”์„œ๋“œ์™€ ์†์„ฑ์„ ์ฐธ์กฐํ•œ๋‹ค.
  • ๊ฐ์ฒด์™€ ํ”„๋กœํ† ํƒ€์ž…์— ๋™์ผํ•œ ์ด๋ฆ„์˜ ์†์„ฑ์ด๋‚˜ ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ๊ฐ์ฒด ์†์„ฑ ๋จผ์ € ์ฐธ์กฐํ•จ
    • property shadowing: ํ”„๋กœํ† ํƒ€์ž… ์†์„ฑ์ด ๊ฐ€๋ ค์ง€๋Š” ํ˜„์ƒ
    • method overriding: ํ”„๋กœํ† ํƒ€์ž… ๋ฉ”์„œ๋“œ๊ฐ€ ๊ฐ€๋ ค์ง€๋Š” ํ˜„์ƒ

 

 

Class

ES6+ Class
: ํด๋ž˜์Šค ๊ธฐ๋ฐ˜ ์–ธ์–ด์— ์ต์ˆ™ํ•œ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋น ๋ฅด๊ฒŒ ํ•™์Šตํ•  ์ˆ˜ ์žˆ๋„๋ก ES6์ด์ƒ๋ถ€ํ„ฐ class ๋ฌธ๋ฒ•์ด ์ถ”๊ฐ€๋จ (ํ”„๋กœํ† ํƒ€์ž… ๊ธฐ๋ฐ˜ ํŒจํ„ด์˜ ๋ฌธ๋ฒ• ์„คํƒ•)

 

Class ๋ฌธ๋ฒ•

  • constructor
    • ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ ์‹œ ํ˜ธ์ถœ๋˜๋Š” ๋ฉ”์„œ๋“œ
    • ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ ์‹œ ์ „๋‹ฌํ•œ ์ธ์ž๋ฅผ constructor ๋ฉ”์„œ๋“œ๋ฅผ ์ธ์ž๋กœ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.
    • ์ƒ๋žต ๊ฐ€๋Šฅ
  • ์ธ์Šคํ„ด์Šค ๋ฉ”์„œ๋“œ
    • ํด๋ž˜์Šค ๋‚ด์— ์กด์žฌํ•˜๋Š” ๋ฉ”์„œ๋“œ
    • ๋ฉ”์„œ๋“œ ๋‚ด์—์„œ ํด๋ž˜์Šค๋ฅผ this๋กœ ์ ‘๊ทผ ๊ฐ€๋Šฅ
    • ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค ์†์„ฑ์—๋„ ์ ‘๊ทผ ๊ฐ€๋Šฅ
  • ์ •์  ๋ฉ”์„œ๋“œ
    • ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š์•„๋„ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์ •์˜ํ•  ๋•Œ ์‚ฌ์šฉ
    • static ํ‚ค์›Œ๋“œ ์‚ฌ์šฉ
    • util์šฉ ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.
class Person {
  constructor(age) {
    this.age = age;
  }

  static legCount() {
    return 2;
  }
}

Person.legCount()
  • ์ธ์Šคํ„ด์Šค ์†์„ฑ
    • ํด๋ž˜์Šค ๋‚ด๋ถ€์— ์บก์Аํ™”๋œ ๋ณ€์ˆ˜ === ๋ฉค๋ฒ„ ๋ณ€์ˆ˜
    • this์— ์ถ”๊ฐ€ํ•œ ์†์„ฑ
    • ์†์„ฑ์€ ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ ์ดํ›„ ๋ฐ”๋กœ ์ฐธ์กฐํ•ด์•ผ ํ•˜๋ฏ€๋กœ, ์ธ์Šคํ„ด์Šค ์†์„ฑ ์ดˆ๊ธฐํ™”๋Š” ๋ณดํ†ต constructor์—์„œ ์ง„ํ–‰ํ•จ
    • getter
      • ํŠน์ • ์ธ์Šคํ„ด์Šค ์†์„ฑ์„ ์กฐํšŒํ•˜๋ฉฐ ์กฐ์ž‘ํ•˜๋Š” ๋ฉ”์„œ๋“œ
      • ์ด๋ฆ„ ์•ž์— get ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด ์ƒ์„ฑํ•˜๋ฉฐ getter๋ฉ”์„œ๋“œ๋Š” ๋ฌด์กฐ๊ฑด ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•จ
      • ์‚ฌ์šฉ ์‹œ, ์ผ๋ฐ˜ ๋ฉ”์„œ๋“œ์ฒ˜๋Ÿผ ํ˜ธ์ถœํ•˜์ง€ ์•Š๊ณ  ์†์„ฑ์ฒ˜๋Ÿผ ์ฐธ์กฐํ•˜๋Š” ํ˜•์‹์œผ๋กœ ์‚ฌ์šฉ
    • setter
      • ํŠน์ • ์ธ์Šคํ„ด์Šค ์†์„ฑ์„ ํ• ๋‹นํ•˜๋ฉฐ ์กฐ์ž‘ํ•˜๋Š” ๋ฉ”์„œ๋“œ
      • ๋ฉ”์„œ๋“œ ์ด๋ฆ„ ์•ž์— set ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ ํ•˜๋‚˜์˜ ์ธ์ž๋ฅผ ๋ฌด์กฐ๊ฑด ๋ฐ›๋„๋ก ์ •์˜ํ•ด์•ผ ํ•จ
      • ์‚ฌ์šฉ ์‹œ, ์ผ๋ฐ˜ ๋ฉ”์„œ๋“œ์ฒ˜๋Ÿผ ํ˜ธ์ถœํ•˜์ง€ ์•Š๊ณ  ์†์„ฑ์ฒ˜๋Ÿผ ํ• ๋‹นํ•˜๋Š” ํ˜•์‹์œผ๋กœ ์‚ฌ์šฉ
  • ํด๋ž˜์Šค ์ƒ์† - extends
    • ์ฝ”๋“œ์˜ ์žฌ์‚ฌ์šฉ ๊ด€์ ์—์„œ ์ƒ์†์ด ํ•„์š”ํ•จ
    • extends, super ํ‚ค์›Œ๋“œ๋กœ ์ƒ์† ๊ตฌํ˜„'
    • super()
      • ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ์ƒ์„ฑ์ž๋ฅผ ํ˜ธ์ถœ
      • ์ž์‹ ํด๋ž˜์Šค์˜ ์ƒ์„ฑ์ž๊ฐ€ this์— ์ ‘๊ทผํ•˜๊ณ  ์ˆ˜์ • ๊ฐ€๋Šฅ
      • ์ž์‹ ํด๋ž˜์Šค์˜ constructor ์‚ฌ์šฉ ์‹œ constructor ๋ฐ˜ํ™˜๋ฌธ ์ „์— ๊ผญ ์‚ฌ์šฉํ•ด์•ผ ํ•จ 
class ๋ถ€๋ชจ { ... }
class ์ž์‹ extends ๋ถ€๋ชจ {
  constructor() {
    super()
    ...
  }
  ...
}

 

 

 

this

: ์ปจํ…์ŠคํŠธ ์ฐธ์กฐ ๊ฐ€๋Šฅํ•œ ํ‚ค์›Œ๋“œ์ด๋ฉฐ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•˜๋Š” ์—ญํ• , ์–ด๋–ค ๊ฐ์ฒด์ธ์ง€ ๋™์ ์œผ๋กœ ๊ฒฐ์ •๋œ๋‹ค.

 

โš ๏ธ ์ „์—ญ๊ฐ์ฒด์—์„œ this ์‚ฌ์šฉ ์‹œ, this๋Š”

  • ๋ธŒ๋ผ์šฐ์ €: window
  • server-side (node): global

ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ this๋Š” ์ „์—ญ ๊ฐ์ฒด์— ๋ฐ”์ธ๋”ฉ๋œ๋‹ค.

โžก๏ธ ๊ฐ์ฒด ๋ฉ”์„œ๋“œ ๋‚ด์— ๋‚ด๋ถ€ ํ•จ์ˆ˜๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ, ํ•จ์ˆ˜ ํ˜ธ์ถœ ๋ฐฉ์‹์œผ๋กœ ์ทจ๊ธ‰๋˜์–ด this๊ฐ€ ์ „์—ญ๊ฐ์ฒด๋ฅผ ๋ฐ”๋ผ๋ณธ๋‹ค. ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด, this๋ฅผ ๋‹ค๋ฅธ ๋ณ€์ˆ˜์— ์ €์žฅํ•˜๊ณ  ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ๋‚ด๋ถ€ ํ•จ์ˆ˜๋ฅผ ํ•ด๋‹น ๊ฐ์ฒด์— bind ํ•ด์•ผ ํ•จ

const foo = {
  name: 'joy',
  age: 28,
  getName() {
    const that = this
    function getAge() {
      console.log(that.age)
    }
    getAge()
  }
}

foo.getName() // 28
const foo = {
  name: 'joy',
  age: 28,
  getName() {
    console.log(this.name)
  }
}

const bar = {
  name: 'kei'
}

bar.getName = foo.getName
foo.getName() // joy
bar.getName() // keiโ€‹

 

this ๋ฐ”์ธ๋”ฉ - ์ƒ์„ฑ์ž ํ•จ์ˆ˜ ํ˜ธ์ถœ๋ฐฉ์‹

  1. ๋นˆ ๊ฐ์ฒด ์ƒ์„ฑ, this ๋ฐ”์ธ๋”ฉ โžก๏ธ this๋Š” ๋นˆ ๊ฐ์ฒด์— ๋ฐ”์ธ๋”ฉ
  2. this๋กœ ์†์„ฑ ์ƒ์„ฑ โžก๏ธ this๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋™์ ์œผ๋กœ ์†์„ฑ๊ณผ ๋ฉ”์„œ๋“œ ์ƒ์„ฑ
  3. ์ƒ์„ฑ๋œ ๊ฐ์ฒด ๋ฐ˜ํ™˜ โžก๏ธ ๋ฐ˜ํ™˜๋ฌธ์ด ์—†์–ด๋„ 1๋ฒˆ์—์„œ ์ƒ์„ฑ๋˜์—ˆ๋˜ ๊ฐ์ฒด๊ฐ€ ๋ฐ˜ํ™˜ ๋จ

 

this ๋ฐ”์ธ๋”ฉ - apply, call, bind

: this๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ๋ฐ”์ธ๋”ฉํ•˜๋Š” ๋ฐฉ๋ฒ•

  • Function.prototype.apply
    • ํ•จ์ˆ˜๋ช….apply(๋ฐ”์ธ๋”ฉํ•  ๊ฐ์ฒด, [ํ•จ์ˆ˜ ํ˜ธ์ถœ ์‹œ ๋„˜๊ธฐ๋Š” ์ธ์ž๋“ค])
  • Function.prototype.call
    • ํ•จ์ˆ˜๋ช….call(๋ฐ”์ธ๋”ฉํ•  ๊ฐ์ฒด, ํ•จ์ˆ˜ ํ˜ธ์ถœ ์‹œ ๋„˜๊ธฐ๋Š” ์ธ์ž1, …)
      1. ํ•จ์ˆ˜ ๋‚ด์˜ this์— ๋ฐ”์ธ๋”ฉํ•  ๊ฐ์ฒด๊ฐ€ ๋ฐ”์ธ๋”ฉ ๋จ
      2. ํ•จ์ˆ˜์— ์ธ์ž๋“ค์ด ์ „๋‹ฌ๋จ
      3. ํ•จ์ˆ˜ ํ˜ธ์ถœ
  • Function.prototype.bind
    • ํ•จ์ˆ˜๋ช….bind(๋ฐ”์ธ๋”ฉํ•  ๊ฐ์ฒด)
      1. ํ•จ์ˆ˜ ๋‚ด์˜ this์— ๋ฐ”์ธ๋”ฉํ•  ๊ฐ์ฒด๊ฐ€ ๋ฐ”์ธ๋”ฉ
      2. ๋ฐ”์ธ๋”ฉ ๋œ ํ•จ์ˆ˜ ๋ฐ˜ํ™˜

apply, call์€ ๋ฐ”์ธ๋”ฉํ•œ ๋™์‹œ์— ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ฉฐ bind๋Š” ๋ฐ”์ธ๋”ฉ๊ณผ ํ•จ์ˆ˜ ํ˜ธ์ถœ์ด ๋ถ„๋ฆฌ๋˜์–ด ์žˆ์Œ

 

this ๋ฐ”์ธ๋”ฉ - ํ™”์‚ดํ‘œ ํ•จ์ˆ˜

: ํ•จ์ˆ˜๋ฅผ ์„ ์–ธํ•  ๋•Œ this์— ๋ฐ”์ธ๋”ฉํ•  ๊ฐ์ฒด๊ฐ€ ์ •์ ์œผ๋กœ ๊ฒฐ์ •๋˜๋ฉฐ ํ•ญ์ƒ, ์ƒ์œ„ ์Šค์ฝ”ํ”„ this๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค.

const foo = {
  name: 'joy',
  age: 28,
  getName: () => {
    console.log(this.name) // ์—ฌ๊ธฐ์„œ this๋Š” ์ „์—ญ๊ฐ์ฒด
  }
}

foo.getName() // ''

 

โš ๏ธ ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋ฅผ ์ง€์–‘ํ•ด์•ผ ํ•˜๋Š” ์‚ฌ์šฉ ํ˜•ํƒœ

  • ๊ฐ์ฒด์˜ ๋ฉ”์„œ๋“œ (+ prototype ๋ฉ”์„œ๋“œ)
  • ์ƒ์„ฑ์ž ํ•จ์ˆ˜ (ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋Š” prototype ๊ฐ์ฒด๊ฐ€ ์—†์Œ)

 

 

Scope

: ๋ณ€์ˆ˜๊ฐ€ ์œ ํšจ์„ฑ์„ ๊ฐ–๋Š” ์˜์—ญ

 

Scope ๊ทœ์น™

  • ์ •์  ์˜์—ญ ๊ทœ์น™ lexical(static) scoping rule
    • ์–ด๋””์„œ ํ˜ธ์ถœํ•œ์ง€๊ฐ€ ์•„๋‹ˆ๋ผ, ์–ด๋””์— ์„ ์–ธํ•˜์˜€๋Š”์ง€์— ๋”ฐ๋ผ ์Šค์ฝ”ํ”„๊ฐ€ ๊ฒฐ์ •๋จ
    • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ์ด ๊ทœ์น™์„ ๋”ฐ๋ฆ„
  • ๋™์  ์˜์—ญ ๊ทœ์น™ dynamic scoping rule
    • ์–ด๋””์„œ ํ˜ธ์ถœํ•˜์˜€๋Š”์ง€์— ๋”ฐ๋ผ ์Šค์ฝ”ํ”„ ๊ฒฐ์ •
    • ๋Ÿฐํƒ€์ž„ ์‹œ ๊ฒฐ์ •๋จ

 

Scope ์ข…๋ฅ˜

  • ์ „์—ญ ์Šค์ฝ”ํ”„: ์†Œ์Šค ์ฝ”๋“œ์ƒ ๋ชจ๋“  ๊ณณ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ „์—ญ ๋ณ€์ˆ˜
  • file ์Šค์ฝ”ํ”„: ํ•ด๋‹น ํŒŒ์ผ ์ „์ฒด์—์„œ ์ ‘๊ทผ ๊ฐ€๋Šฅ
    • ES6+ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ <script type="module" ...>๋กœ ์กฐํšŒ๋˜๋Š” ํŒŒ์ผ
  • ๋ชจ๋“ˆ ์Šค์ฝ”ํ”„
  • ํ•จ์ˆ˜ ๋ ˆ๋ฒจ ์Šค์ฝ”ํ”„
    • ์ง€์—ญ๋ณ€์ˆ˜: ํ•จ์ˆ˜ ๋‚ด์— ์œ ํšจํ•œ ๋ณ€์ˆ˜
    • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ํ•จ์ˆ˜ ๋ ˆ๋ฒจ ์Šค์ฝ”ํ”„์ด๋‹ค.
  • ๋ธ”๋ก ๋ ˆ๋ฒจ ์Šค์ฝ”ํ”„
    • ์ง€์—ญ๋ณ€์ˆ˜: ์ฝ”๋“œ๋ธ”๋Ÿญ ๋‚ด์—์„œ ์œ ํšจํ•œ ๋ณ€์ˆ˜
    • ES6+ JS: let, const๋Š” ๋ธ”๋ก๋ ˆ๋ฒจ ์Šค์ฝ”ํ”„

๋ธ”๋ก ๋ ˆ๋ฒจ ์Šค์ฝ”ํ”„ ์˜ˆ์‹œ)

const foo = 'foo'

{
  const bar = 'bar'
}

console.log(bar) // ReferenceError: bar is not defined

 

ํ•จ์ˆ˜ ๋ ˆ๋ฒจ ์Šค์ฝ”ํ”„ ์˜ˆ์‹œ)

var foo = 'foo'

{
  var bar = 'bar'
}

console.log(bar) // 'bar'

 

 

์‹คํ–‰ ์ปจํ…์ŠคํŠธ

: ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜๋Š” ๋ฒ”์œ„์— ๋Œ€ํ•œ ๊ฐœ๋…

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ์ •๋ณด

  • ๋ณ€์ˆ˜
  • ํ•จ์ˆ˜ ์„ ์–ธ
  • ๋ณ€์ˆ˜์˜ ์œ ํšจ๋ฒ”์œ„ (์Šค์ฝ”ํ”„)
  • this

โžก๏ธ ์ด๋Ÿฌํ•œ ์ •๋ณด๋ฅผ ๋ฌผ๋ฆฌ์  ๊ฐ์ฒด ํ˜•ํƒœ๋กœ ๊ด€๋ฆฌํ•œ๋‹ค. 

 

์‹คํ–‰ ์ปจํ…์ŠคํŠธ์˜ ์ƒ์„ฑ ๋‹จ๊ณ„ - Createion Phase

์ฝ”๋“œ ํ‰๊ฐ€๋‹จ๊ณ„์—์„œ Lexical Environment ์ƒ์„ฑ

  • ํ•จ์ˆ˜์™€ ๋ณ€์ˆ˜๋ฅผ ๊ธฐ๋ก (Environment Record)
    • ์„ ์–ธ ์ •์˜, ๊ฐ์ฒด ์ •์˜
    • this ๋ฐ”์ธ๋”ฉ: ํ•จ์ˆ˜ ํ˜ธ์ถœ ์—ฌ๋ถ€์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง
  • ์™ธ๋ถ€ ํ™˜๊ฒฝ ์ฐธ์กฐ (Outer Environment Reference)
    • ์Šค์ฝ”ํ”„ ์ฒด์ธ ํ˜•์„ฑ

์‹คํ–‰ ์ปจํ…์ŠคํŠธ์˜ ์‹คํ–‰ ๋‹จ๊ณ„ - Execution Phase

์ฝ”๋“œ ์‹คํ–‰๋‹จ๊ณ„์—์„œ ์œ„์—์„œ ์•„๋ž˜๋กœ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰

๋ณ€์ˆ˜๋Š” ๊ฐ’์ด ํ• ๋‹น๋˜๊ณ  ํ•จ์ˆ˜ ์‹คํ–‰ ์ฝ”๋“œ๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.

 

โœ… ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ Call Stack

: ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์ด ํ˜ธ์ถœ๋œ ํ•จ์ˆ˜์™€ ์ˆœ์„œ๋ฅผ ์ถ”์ ํ•˜๋Š” ๋ฐฉ๋ฒ•

  • ์–ด๋–ค ํ•จ์ˆ˜๊ฐ€ ๋™์ž‘ํ•˜๊ณ  ์žˆ๋Š”์ง€ ๋‹ค์Œ์— ์–ด๋–ค ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜์–ด์•ผ ํ•˜๋Š”์ง€๋ฅผ ์ œ์–ดํ•จ
  • Stack ์ž๋ฃŒ๊ตฌ์กฐ (LIFO)๋ฅผ ์‚ฌ์šฉํ•จ
  • ์ฝœ ์Šคํƒ: ํ•จ์ˆ˜ ํ˜ธ์ถœ ์‹œ ๋งŒ๋“ค์–ด์ง€๋Š” ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ์Œ“์ด๊ณ  ํ•˜๋‚˜์˜ ์ผ๋งŒ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅํ•จ
  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์€ ์ฝ”๋“œ๋ฅผ ํ‰๊ฐ€ํ•˜์—ฌ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๋ฅผ ๋งŒ๋“ค์–ด โžก๏ธ ์ฝœ ์Šคํƒ์— ํ•˜๋‚˜์”ฉ ์Œ“๊ณ  โžก๏ธ ์ฝœ ์Šคํƒ์—์„œ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•˜๋ฉฐ โžก๏ธ ์Šคํƒ์—์„œ ํ•˜๋‚˜์”ฉ ์—†์•ค๋‹ค.

 

 

ํด๋กœ์ €

: ํ•จ์ˆ˜๊ฐ€ ์ข…๋ฃŒ๋˜์—ˆ๋Š”๋ฐ ์•„์ง ์ฐธ์กฐ๊ฐ€ ๋‚จ์•„์žˆ๋Š” ๊ฒฝ์šฐ

โžก๏ธ ์™ธ๋ถ€ ํ•จ์ˆ˜ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ ํ™˜๊ฒฝ์˜ ๋ณ€์ˆ˜๋ฅผ ์ฐธ์กฐํ•˜๊ณ  ์žˆ๋Š” ๋‚ด๋ถ€ ํ•จ์ˆ˜ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ

์ž์‹ ์„ ํฌํ•จํ•˜๊ณ  ์žˆ๋Š” ์™ธ๋ถ€ํ•จ์ˆ˜๋ณด๋‹ค ๋‚ด๋ถ€ํ•จ์ˆ˜๊ฐ€ ๋” ์˜ค๋ž˜ ์œ ์ง€๋˜๋Š” ๊ฒฝ์šฐ, ์™ธ๋ถ€ ํ•จ์ˆ˜ ๋ฐ–์—์„œ ๋‚ด๋ถ€ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜๋”๋ผ๋„ ์™ธ๋ถ€ํ•จ์ˆ˜์˜ ์ง€์—ญ ๋ณ€์ˆ˜์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ ์ด๋Ÿฌํ•œ ํ•จ์ˆ˜๋ฅผ ํด๋กœ์ €(Closure)๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค. - poiemaWeb

 

ํ•จ์ˆ˜๊ฐ€ ์ข…๋ฃŒ๋˜์–ด๋„ ์Šค์ฝ”ํ”„๋ฅผ ๊ธฐ์–ตํ•˜์—ฌ ํŠน์ • ์Šค์ฝ”ํ”„์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ํ•จ์ˆ˜์ด๋ฉฐ ์ƒํƒœ ์œ ์ง€, ์€๋‹‰ํ™”์— ์‚ฌ์šฉํ•œ๋‹ค.

 

 

 

 

๋งˆ๋ฌด๋ฆฌ


์–ด์ œ๋ถ€ํ„ฐ ๊ฐ•์˜๊ฐ€ ๋„ˆ๋ฌด ๋งŽ์•„์ ธ์„œ ์ƒˆ๋ฒฝ๊นŒ์ง€ ๊ณต๋ถ€ํ•˜๋А๋ผ ํž˜๋“ค์—ˆ๋‹ค. ๐Ÿ˜ญ

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

๋‚ผ์€ ์•„์นจ ์ผ์ฐ ์ผ์–ด๋‚˜์„œ ์šด๋™ ๋‹ค๋…€์™€์„œ ๋ฐ”๋กœ ๊ณต๋ถ€ํ•ด์•ผ์ง€!