All Projects โ†’ dangen-effy โ†’ Modern Javascript

dangen-effy / Modern Javascript

Licence: mit
๐ŸŒŸ ๋ชจ๋˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ์ ์ฐจ ํ˜„๋Œ€์ ์ด๊ณ  ์‹ค์šฉ์ ์œผ๋กœ ๋ณ€ํ™”ํ•˜๊ณ  ์žˆ๋Š” ECMAScript ์— ์ ์‘ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ๋ ค์ค๋‹ˆ๋‹ค.

Programming Languages

javascript
184084 projects - #8 most used programming language
es6
455 projects
ecmascript
72 projects

์†Œ๊ฐœ ๐Ÿ’โ€โ™‚๏ธ

๋ชจ๋˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ์†Œ๊ฐœํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ์ ์ฐจ ํ˜„๋Œ€์ ์ด๊ณ  ์‹ค์šฉ์ ์œผ๋กœ ๋ณ€ํ™”ํ•˜๊ณ  ์žˆ๋Š” ECMAScript ์— ์ ์‘ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ๋ ค์ค๋‹ˆ๋‹ค.

ํ˜„์žฌ ๊ธ€์„ ์“ฐ๊ณ  ์žˆ๋Š” ์‹œ์ ์ธ 2020๋…„์˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ์ด๋ฏธ ํ’๋ถ€ํ•œ ํ‘œ์ค€ ๋‚ด์žฅ ๊ฐ์ฒด(Standard built-in objects)๋“ค์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋•๋ถ„์— ์šฐ๋ฆฌ๋Š” ๋” ์ด์ƒ ์ „ํ†ต์ ์ด๊ณ  ๊ฑฐ๋Œ€ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(lodash ์™€ ๊ฐ™์€)๋“ค์„ ์‚ฌ์šฉํ•  ํ•„์š”์„ฑ์ด ์ค„์–ด๋“ค๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์ฐธ๊ณ : ๋ชจ๋˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ES6+ ํ™˜๊ฒฝ์—์„œ ์ง„ํ–‰๋ฉ๋‹ˆ๋‹ค.

๋ชจ๋˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๋ชฉ์ 

  • ๊ฐœ๋ฐœ์ž์˜ ์‹ค์ˆ˜ ์ค„์ด๊ธฐ
  • ์˜๋„์น˜ ์•Š์€ ๋™์ž‘ ๋ฐฉ์ง€
  • ๊ฐ„๊ฒฐํ•˜๊ณ  ์ฝ๊ธฐ ์‰ฌ์šด ์ฝ”๋“œ ์ž‘์„ฑ

๋ชจ๋˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์ข‹์•„ํ•˜๋Š” ๊ฒƒ ๐Ÿ‘

  • ๋‹จ์ˆœํ•จ
  • ๊ฐ€๋ฒผ์›€
  • ๋ณธ์งˆ
  • MDN ๋ฌธ์„œ
  • TC39

๋ชจ๋˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์‹ซ์–ดํ•˜๋Š” ๊ฒƒ ๐Ÿ‘Ž

  • ๋ณต์žกํ•จ
  • ๋ฌด๊ฑฐ์›€
  • ์žฅํ™ฉํ•จ (Verbose)
  • ๋ถˆํ•„์š”ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉ

๋ชจ๋˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ์•„๋ž˜ ๊ฐœ๋…๋“ค์˜ ๋ณธ์งˆ์„ ์ตœ๋Œ€ ํ•œ๋‘ ๋ฌธ์žฅ ์ด๋‚ด๋กœ ๊ฐ„๋‹จ ๋ช…๋ฃŒํ•˜๊ฒŒ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ๋ณธ์งˆ์„ ๊ฟฐ๋šซ์œผ๋ฉด ๊ธธ๊ฒŒ ์„ค๋ช…ํ•  ํ•„์š”๋„ ์—†์Šต๋‹ˆ๋‹ค.

๋ชจ๋˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๋‹ค๋ฃจ๋Š” ๊ฐœ๋…

Let Declaration

Const Declaration

Spread Syntax

Destructuring Assignment

Rest Parameters

Rest Elements

Default Parameter

Named Parameter

Promise

Async Function


Let Declaration

์ •์˜

๋ธ”๋ก ๋ ˆ๋ฒจ ์œ ํšจ ๋ฒ”์œ„๋ฅผ ๊ฐ–๋Š” ์ง€์—ญ ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•ฉ๋‹ˆ๋‹ค.

ํŠน์ง•

let ์œผ๋กœ ์„ ์–ธํ•œ ๋ณ€์ˆ˜๋Š” ์žฌ์„ ์–ธํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

let ์œผ๋กœ ์„ ์–ธํ•œ ๋ณ€์ˆ˜๋Š” ๊ฐ’์„ ์žฌํ• ๋‹น ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

let ์€ ๋ธ”๋ก ๋ ˆ๋ฒจ ์œ ํšจ ๋ฒ”์œ„๋ฅผ ๊ฐ€์ง‘๋‹ˆ๋‹ค. ๋ธ”๋ก ๋ ˆ๋ฒจ์€ ๋ชจ๋“  ์ฝ”๋“œ ๋ธ”๋ก์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ํ•จ์ˆ˜, if, switch, for, while, try-catch, ... ๋‚ด๋ถ€์—์„œ ์„ ์–ธ๋œ let ๋ณ€์ˆ˜๋Š” ์™ธ๋ถ€์—์„œ ์ ‘๊ทผํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์ฐธ๊ณ 

let ์œผ๋กœ ์„ ์–ธ๋œ ๋ณ€์ˆ˜๋“ค์€ ์ฝ”๋“œ๋ฅผ ์ฝ์„ ๋•Œ ๋ณ€ํ•จ(mutable)์„ ๊ธฐ๋Œ€ํ•˜๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ์ด๋Š” ์ฝ”๋“œ ๋ฆฌ๋ทฐ์–ด๊ฐ€ ํ•ด๋‹น ๋ณ€์ˆ˜๊ฐ€ ์–ธ์ œ ๋ฐ”๋€Œ๋Š”์ง€ ๊ณ„์†ํ•ด์„œ ์ถ”์ ํ•˜๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ์ด๋Š” ๊ต‰์žฅํžˆ ํ”ผ๊ณคํ•œ ์ผ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ณ€ํ•˜์ง€ ์•Š๋Š” ๋ณ€์ˆ˜๋“ค์€ ์–ธ์ œ๋‚˜ ์ƒ์ˆ˜(const)๋กœ ์„ ์–ธํ•˜์„ธ์š”.

1. ์žฌ์„ ์–ธ ๋ถˆ๊ฐ€๋Šฅ

๐Ÿ‘‰์‹œ๋‚˜๋ฆฌ์˜ค: let ์ด var ๊ณผ ๋‹ค๋ฅด๊ฒŒ ์žฌ์„ ์–ธ ํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฑธ ์ฆ๋ช…ํ•˜์„ธ์š”.

var a
var a // ์žฌ์„ ์–ธ ํ†ต๊ณผ

let b
let b // -> SyntaxError: Identifier 'b' has already been declared ๐Ÿ‘

2. ์žฌํ• ๋‹น

๐Ÿ‘‰์‹œ๋‚˜๋ฆฌ์˜ค: let ์ด const ์™€ ๋‹ค๋ฅด๊ฒŒ ์žฌํ• ๋‹น ๊ฐ€๋Šฅํ•œ ๊ฑธ ์ฆ๋ช…ํ•˜์„ธ์š”.

let a = 1
a = 2 // ์žฌํ• ๋‹น ๊ฐ€๋Šฅ ๐Ÿ‘

const b = 1
b = 2 // -> TypeError: Assignment to constant variable.

3. ์œ ํšจ ๋ฒ”์œ„

๐Ÿ‘‰์‹œ๋‚˜๋ฆฌ์˜ค: let ์ด var ๊ณผ ๋‹ค๋ฅด๊ฒŒ ๋ธ”๋ก ์œ ํšจ ๋ฒ”์œ„๋ฅผ ๊ฐ€์ง€๋Š”๊ฑธ ์ฆ๋ช…ํ•˜์„ธ์š”.

if (true) {
  var a = 1
  let b = 1
}

console.log(a) // -> 1
console.log(b) // -> ReferenceError: b is not defined ๐Ÿ‘

Const Declaration

์ •์˜

๋ธ”๋ก ๋ ˆ๋ฒจ ์œ ํšจ ๋ฒ”์œ„๋ฅผ ๊ฐ–๋Š” ์ƒ์ˆ˜๋ฅผ ์„ ์–ธํ•ฉ๋‹ˆ๋‹ค.

ํŠน์ง•

const ๋Š” ์„ ์–ธ๊ณผ ๋™์‹œ์— ํ• ๋‹นํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰ ์–ธ์ œ๋‚˜ ์ดˆ๊นƒ๊ฐ’์„ ํ•„์š”๋กœ ํ•ฉ๋‹ˆ๋‹ค.

const ๋Š” ์žฌํ• ๋‹น ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

const ๋Š” let ๊ณผ ๋™์ผํ•˜๊ฒŒ ๋ธ”๋ก ๋ ˆ๋ฒจ ์œ ํšจ ๋ฒ”์œ„๋ฅผ ๊ฐ€์ง‘๋‹ˆ๋‹ค.

1. ์„ ์–ธ๊ณผ ๋™์‹œ์— ํ• ๋‹น

๐Ÿ‘‰์‹œ๋‚˜๋ฆฌ์˜ค: const ๊ฐ€ ์„ ์–ธ๊ณผ ๋™์‹œ์— ํ• ๋‹นํ•ด์•ผ ํ•จ์„ ์ฆ๋ช…ํ•˜์„ธ์š”.

const a = 1
const b // -> SyntaxError: Missing initializer in const declaration

2. ์žฌํ• ๋‹น ๋ถˆ๊ฐ€๋Šฅ

๐Ÿ‘‰์‹œ๋‚˜๋ฆฌ์˜ค: const ๊ฐ€ ์žฌํ• ๋‹น ๋ถˆ๊ฐ€๋Šฅํ•จ์„ ์ฆ๋ช…ํ•˜์„ธ์š”.

const a = 1
a = 2 // -> TypeError: Assignment to constant variable

3. ์œ ํšจ ๋ฒ”์œ„

๐Ÿ‘‰์‹œ๋‚˜๋ฆฌ์˜ค: const ๊ฐ€ let ๊ณผ ๋™์ผํ•˜๊ฒŒ ๋ธ”๋ก ๋ ˆ๋ฒจ ์œ ํšจ ๋ฒ”์œ„๋ฅผ ๊ฐ€์ง€๋Š” ๊ฒƒ์„ ์ฆ๋ช…ํ•˜์„ธ์š”.

if (true) {
  var a = 1
  const b = 1
}

console.log(a) // -> 1
console.log(b) // -> ReferenceError: b is not defined ๐Ÿ‘

Spread Syntax

์ •์˜

Spread Syntax ๋Š” ํŠน์ • ๊ฐ์ฒด ํ˜น์€ ๋ฐฐ์—ด์˜ ๋‚˜๋จธ์ง€ ์š”์†Œ๋“ค์„ ์–ด๋–ค ๊ฐ์ฒด ํ˜น์€ ๋ฐฐ์—ด ๋ฆฌํ„ฐ๋Ÿด์— ํ’€์–ด ๋†“์Šต๋‹ˆ๋‹ค.

ํŠน์ง•

Spread Syntax ๋กœ ์ƒˆ๋กœ์šด ๋ณ€์ˆ˜๊ฐ€ ์„ ์–ธ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

1. ๋ฐฐ์—ด ์ „๊ฐœ๊ตฌ๋ฌธ

ํ™œ์šฉ 1: ์•ˆ์ „ํ•œ ๋ณต์‚ฌ

๐Ÿ‘‰ ์‹œ๋‚˜๋ฆฌ์˜ค: arr1 ๊ณผ ๋˜‘๊ฐ™์€ arr2 ๋ฅผ ๋งŒ๋“œ์„ธ์š”.

๐Ÿ‘‰ ์กฐ๊ฑด: arr1 ์˜ ๋ณ€ํ˜•์ด arr2 ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š๊ฒŒ ํ•˜์„ธ์š”.

๋ถˆโ€”ํŽธ

const arr1 = [1, 2, 3]
const arr2 = arr1 // arr2 ๋Š” arr1 ๋ฅผ ์ฐธ์กฐํ•ฉ๋‹ˆ๋‹ค.

arr1.push(4)

console.log(arr1) // -> [ 1, 2, 3, 4 ]
console.log(arr2) // -> [ 1, 2, 3, 4 ] arr2 ๊นŒ์ง€ ๋ณ€ํ˜•๋์Šต๋‹ˆ๋‹ค. ๐Ÿ‘Ž

ํŽธโ€”์•ˆ โœ…

const arr1 = [1, 2, 3]
const arr2 = [...arr1] // arr1 ๋ฅผ ๊ตฌ์กฐ ๋ถ„ํ•ด์‹œ์ผœ '์ƒˆ๋กœ์šด' ๋ฐฐ์—ด์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๐Ÿ‘

arr1.push(4)

console.log(arr1) // -> [ 1, 2, 3, 4 ]
console.log(arr2) // -> [ 1, 2, 3 ] ๐Ÿ‘

2. ๊ฐ์ฒด ์ „๊ฐœ๊ตฌ๋ฌธ

ํ™œ์šฉ 1: ์•ˆ์ „ํ•œ ๊ฐ์ฒด ์–•์€ ๋ณ‘ํ•ฉ

๐Ÿ‘‰ ์‹œ๋‚˜๋ฆฌ์˜ค: ์ฃผ์–ด์ง„ obj1 ์— obj2 ๋ฅผ ๋ณ‘ํ•ฉํ•˜์„ธ์š”.

๐Ÿ‘‰ ์กฐ๊ฑด1: ์ค‘๋ณต ํ•„๋“œ๊ฐ€ ์žˆ๋‹ค๋ฉด obj2 ์˜ ๊ฐ’์œผ๋กœ ๋ฎ์–ด์”Œ์šฐ์„ธ์š”.

๐Ÿ‘‰ ์กฐ๊ฑด2: ์ฃผ์–ด์ง„ ๊ฐ์ฒด๋ฅผ ๋ณ€ํ˜•ํ•˜์ง€ ๋งˆ์„ธ์š”.

๋ถˆโ€”ํŽธ

const obj1 = { a: 1, b: 1 }
const obj2 = { b: 2, c: 2 }

// ๋‚˜์˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค๋งŒ obj1 ์ด ์ˆ˜์ •๋ฉ๋‹ˆ๋‹ค. ๐Ÿ‘Ž
const merged = Object.assign(obj1, obj2)

ํŽธโ€”์•ˆ โœ…

const obj1 = { a: 1, b: 1 }
const obj2 = { b: 2, c: 2 }

// ๋ชจ๋“  ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋ฉฐ ์‹ฌํ”Œํ•ฉ๋‹ˆ๋‹ค! ๐Ÿ‘
const merged = { ...obj1, ...obj2 }

Destructuring Assignment

์ •์˜

๋ฐฐ์—ด์ด๋‚˜ ๊ฐ์ฒด์˜ ์†์„ฑ์„ ํ•ด์ฒดํ•˜์—ฌ ๊ทธ ๊ฐ’์„ ๊ฐœ๋ณ„ ๋ณ€์ˆ˜์— ๋‹ด์Šต๋‹ˆ๋‹ค.

1. ๊ฐ์ฒด ๊ตฌ์กฐ ๋ถ„ํ•ด ํ• ๋‹น

๊ฐ์ฒด๋ฅผ ๊ตฌ์กฐ ๋ถ„ํ•ดํ•ด๋ด…์‹œ๋‹ค.

ํ™œ์šฉ 1: ๊ธฐ๋ณธ๊ฐ’ ํ• ๋‹น

๐Ÿ‘‰ ์‹œ๋‚˜๋ฆฌ์˜ค: me ๊ฐ์ฒด๋ฅผ ์ถœ๋ ฅํ•˜์„ธ์š”.

๐Ÿ‘‰ ์กฐ๊ฑด: me.car ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉด ์—†์Œ ์„ ์ถœ๋ ฅํ•˜์„ธ์š”.

๋ถˆโ€”ํŽธ

const me = {
  firstName: '๋‹น๊ทผ',
  lastName: '์†',
  hobby: ['๐Ÿณ', '๐Ÿ', '๐ŸŽ’', '๐ŸŒผ'],
  location: '์ง€๊ตฌ',

  car: 'ํ…Œ์Šฌ๋ผ'
}

// ์œฝ... ๋‚ด ๋ˆˆ...!
console.log('์ด๋ฆ„', me.lastName, me.firstName)
console.log('์ง€์—ญ', me.location)
console.log('์ทจ๋ฏธ', me.hobby)

// ๋” ์‹ฌํ”Œํ•˜๊ฒŒ ์•ˆ๋ ๊นŒ์š”?
if (me.car) {
  console.log('์ž๋™์ฐจ', me.car)
} else {
  console.log('์ž๋™์ฐจ', '์—†์Œ')
}

ํŽธโ€”์•ˆ โœ…

const me = {
  firstName: '๋‹น๊ทผ',
  lastName: '์†',
  hobby: ['๐Ÿณ', '๐Ÿ', '๐ŸŽ’', '๐ŸŒผ'],
  location: '์ง€๊ตฌ',

  car: 'ํ…Œ์Šฌ๋ผ'
}

const { firstName, lastName, hobby, location, car = '์—†์Œ' } = me // ์ข‹์Šต๋‹ˆ๋‹ค. ๐Ÿ‘

console.log('์ด๋ฆ„', lastName, firstName)
console.log('์ง€์—ญ', location)
console.log('์ทจ๋ฏธ', hobby)
console.log('์ž๋™์ฐจ', car)

2. ๋ฐฐ์—ด ๊ตฌ์กฐ ๋ถ„ํ•ด ํ• ๋‹น

๋ฐฐ์—ด์„ ๊ตฌ์กฐ ๋ถ„ํ•ดํ•ด๋ด…์‹œ๋‹ค.

๐Ÿ‘‰ ์‹œ๋‚˜๋ฆฌ์˜ค: ๋ฐฐ์—ด arr ์˜ ์ฒซ ๋ฒˆ์งธ์™€ ์„ธ ๋ฒˆ์งธ ์›์†Œ๋ฅผ ๊ฐ๊ฐ first ์™€ third ๋ณ€์ˆ˜์— ํ• ๋‹น ๋ฐ ์„ ์–ธํ•˜์„ธ์š”.

๋ถˆโ€”ํŽธ

const arr = [1, 2, 3, 4]

const first = arr[0] // ์ข€ ๋” ์‹ฌํ”Œํ•˜๊ฒŒ ์•ˆ๋ ๊นŒ์š”?
const third = arr[2] // ์ธ๋ฑ์Šค๋กœ ์ ‘๊ทผํ•˜์ง€ ์•Š์œผ๋ฉด์„œ์š”

ํŽธโ€”์•ˆ โœ…

const arr = [1, 2, 3, 4]

const [first, , third] = arr // ์ข‹์Šต๋‹ˆ๋‹ค. ๐Ÿ‘

Rest Parameters

์ •์˜

Rest Parameters ๋Š” ์ •ํ•ด์ง€์ง€ ์•Š์€ ์ˆ˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‹ค์ œ ๋ฐฐ์—ด๋กœ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

1. ๋‚˜๋จธ์ง€ ๋งค๊ฐœ๋ณ€์ˆ˜ ์˜ˆ์‹œ

๐Ÿ‘‰ ์‹œ๋‚˜๋ฆฌ์˜ค: ๊ฐœ์ˆ˜๊ฐ€ ์ •ํ•ด์ง€์ง€ ์•Š์€ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ž…๋ ฅ ๋ฐ›์•„ ์ด์˜ ์ด ํ•ฉ์„ ๊ตฌํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•˜์„ธ์š”.

๋ถˆโ€”ํŽธ

function sum (a, b, ... y, z) {
  return a + b + ... + y + z
} // [a-z] ๊นŒ์ง€ ์ž…๋ ฅ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰ ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ๊ฐœ์ˆ˜๊ฐ€ ์ •ํ•ด์ ธ ์žˆ์Šต๋‹ˆ๋‹ค. ๐Ÿ‘Ž
    
console.log(sum(1, 2, 3, 4, 5, 6, 7, 8)) // [i-z] ๊นŒ์ง€ undefined, ๋•Œ๋ฌธ์— NaN ์ถœ๋ ฅ ๐Ÿ‘Ž

ํŽธโ€”์•ˆ โœ…

function sum (...params) {
  return params.reduce((prev, curr) => prev + curr)
} // ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ๋ช‡ ๊ฐœ๋“  ํ•ฉ์„ ์ž˜ ๊ตฌํ•ฉ๋‹ˆ๋‹ค.

console.log(sum(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)) // -> 55 ๐Ÿ‘

2. ๋˜ ๋‹ค๋ฅธ ๋‚˜๋จธ์ง€ ๋งค๊ฐœ๋ณ€์ˆ˜ ์˜ˆ์‹œ

๐Ÿ‘‰ ์‹œ๋‚˜๋ฆฌ์˜ค: ์ฒซ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜์™€ ๋‚˜๋จธ์ง€ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๊ณฑํ•œ ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•˜์„ธ์š”.

ํŽธโ€”์•ˆ โœ…

function multiply (multiplier, ...params) {
  return params.map(param => multiplier * param)
}

console.log(multiply(5, 1, 2, 3, 4)) // -> [ 5, 10, 15, 20 ] ๐Ÿ‘

3. arguments ์™€ ๋‹ค๋ฅธ์ 

arguments ๋Š” ์œ ์‚ฌ ๋ฐฐ์—ด์ž…๋‹ˆ๋‹ค. ๋•Œ๋ฌธ์— map, reduce, forEach ์™€ ๊ฐ™์€ ๋ฐฐ์—ด ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

function sum (a, b, c) {
  // -> TypeError: arguments.reduce is not a function
  return arguments.reduce((prev, curr) => prev + curr)
}

sum(1, 2, 3)

Rest Elements

์ •์˜

Rest Elements ๋Š” ๊ฐ์ฒด๋‚˜ ๋ฐฐ์—ด์˜ ๋‚˜๋จธ์ง€ ์š”์†Œ๋“ค์„ ์„ ์–ธ๊ณผ ๋™์‹œ์— ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค.

ํŠน์ง•

๋‚˜๋จธ์ง€ ์š”์†Œ์—์„œ ๋ช…์‹œํ•œ ๋ณ€์ˆ˜๋ช…์ด ์„ ์–ธ๋˜๋Š” ํšจ๊ณผ๋ฅผ ๊ฐ€์ง€๋ฉฐ ๊ตฌ์กฐ ๋ถ„ํ•ด ํ• ๋‹น๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉ ์‹œ ๋งจ ๋งˆ์ง€๋ง‰์— ํ•œ ๋ฒˆ๋งŒ ์œ„์น˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ™œ์šฉ 1: ๋ฐฐ์—ด ๋‚˜๋จธ์ง€ ์š”์†Œ

๐Ÿ‘‰ ์‹œ๋‚˜๋ฆฌ์˜ค: arr ๋ฐฐ์—ด์˜ ์ฒซ๋ฒˆ์งธ ์š”์†Œ๋ฅผ first ์— ํ• ๋‹นํ•˜๊ณ  ๋‚˜๋จธ์ง€ ์š”์†Œ๋ฅผ rest ์— ํ’€์–ด ๋„ฃ์œผ์„ธ์š”.

ํŽธโ€”์•ˆ โœ…

const arr = [1, 2, 3, 4, 5]
const [first, ...rest] = arr

console.log(first) // -> 1
console.log(rest) // -> [ 2, 3, 4, 5 ] ๐Ÿ‘

ํ™œ์šฉ 2: ๊ฐ์ฒด ๋‚˜๋จธ์ง€ ์š”์†Œ

๐Ÿ‘‰ ์‹œ๋‚˜๋ฆฌ์˜ค: me ๊ฐ์ฒด์˜ name ํ•„๋“œ๋งŒ name ์— ํ• ๋‹นํ•˜๊ณ  ๋‚˜๋จธ์ง€ ์š”์†Œ๋ฅผ rest ์— ํ’€์–ด ๋„ฃ์œผ์„ธ์š”.

๋ถˆโ€”ํŽธ

const me = {
  name: '์†๋‹น๊ทผ',
  hobby: '์‚ฐ์ฑ…',
  location: 'earth'
}

// ๋” ์‹ฌํ”Œํ•˜๊ฒŒ ์•ˆ๋ ๊นŒ์š”?
const name = me.name
const rest = {
  hobby: me.hobby,
  location: me.location
}

ํŽธโ€”์•ˆ โœ…

const me = {
  name: '์†๋‹น๊ทผ',
  hobby: '์‚ฐ์ฑ…',
  location: 'earth'
}

const { name, ...rest } = me // ๐Ÿ‘

Default Parameter

์ •์˜

Default Parameter ๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜์— ๊ธฐ๋ณธ ๊ฐ’์„ ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค.

ํ™œ์šฉ1: ๋งค๊ฐœ๋ณ€์ˆ˜ ๊ธฐ๋ณธ ๊ฐ’

๐Ÿ‘‰ ์‹œ๋‚˜๋ฆฌ์˜ค: ์ด๋ฆ„ ๊ทธ๋ฆฌ๊ณ  ๋‚˜์ด๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ํ•จ์ˆ˜ aboutMe ๋ฅผ ์ž‘์„ฑํ•˜์„ธ์š”.

๐Ÿ‘‰ ์กฐ๊ฑด 1: ๋‚˜์ด๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋„˜๊ฒจ์ฃผ์ง€ ์•Š์•˜๋‹ค๋ฉด ๋น„๊ณต๊ฐœ ๋กœ ์ถœ๋ ฅํ•˜์„ธ์š”.

๐Ÿ‘‰ ์กฐ๊ฑด 2: 0 ์‚ด ๋„ ์ž…๋ ฅ ๊ฐ€๋Šฅํ•˜๋„๋ก ๋งŒ๋“œ์„ธ์š”.

๋ถˆโ€”ํŽธ

function aboutMe (name, age) {
  // ์œฝ... ๋‚ด ๋ˆˆ...! ๐Ÿ‘Ž
  // ๋” ์‹ฌํ”Œํ•˜๊ฒŒ ์•ˆ ๋ ๊นŒ์š”?
  age = (typeof age !== 'undefined') ? age : '๋น„๊ณต๊ฐœ'

  console.log(name, age)
}

aboutMe('์†๋‹น๊ทผ') // -> ์†๋‹น๊ทผ ๋น„๊ณต๊ฐœ
aboutMe('์†๋‹น๊ทผ', 0) // -> ์†๋‹น๊ทผ 0
aboutMe('์†๋‹น๊ทผ', 20) // -> ์†๋‹น๊ทผ 20

๋ถˆโ€”ํŽธ

function aboutMe (name, age) {
  if (!age) { //  0 ์€ '๊ฑฐ์ง“ ๊ฐ’' ์ด๊ธฐ ๋•Œ๋ฌธ์— 0 ์‚ด์„ ์ž…๋ ฅํ•ด๋„ '๋น„๊ณต๊ฐœ'๋ฅผ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค. ๐Ÿ‘Ž
    age = '๋น„๊ณต๊ฐœ'
  }

  console.log(name, age)
}

aboutMe('์†๋‹น๊ทผ') // -> ์†๋‹น๊ทผ ๋น„๊ณต๊ฐœ
aboutMe('์†๋‹น๊ทผ', 0) // -> ์†๋‹น๊ทผ ๋น„๊ณต๊ฐœ ... 0 ์‚ด์„ ์ž…๋ ฅํ–ˆ์ง€๋งŒ '๋น„๊ณต๊ฐœ'๊ฐ€ ์ถœ๋ ฅ๋๋„ค์š”? ๐Ÿ‘Ž
aboutMe('์†๋‹น๊ทผ', 20) // -> ์†๋‹น๊ทผ 20

ํŽธโ€”์•ˆ โœ…

function aboutMe (name, age = '๋น„๊ณต๊ฐœ') { // ๋ชจ๋“  ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋ฉฐ ์‹ฌํ”Œํ•ฉ๋‹ˆ๋‹ค. ๐Ÿ‘ 
  console.log(name, age)
}

aboutMe('์†๋‹น๊ทผ') // -> ์†๋‹น๊ทผ ๋น„๊ณต๊ฐœ
aboutMe('์†๋‹น๊ทผ', 0) // -> ์†๋‹น๊ทผ 0
aboutMe('์†๋‹น๊ทผ', 20) // -> ์†๋‹น๊ทผ 20

๐Ÿคทโ€โ™€๏ธ ํ•˜์ง€๋งŒ...

์ด๋ฆ„์€ ์ž…๋ ฅํ•˜์ง€ ์•Š๊ณ  ๋‚˜์ด๋งŒ ์ž…๋ ฅํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ• ๊นŒ์š”? ๊ทธ๊ฑด ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

์™œ๋ƒ๋ฉด aboutMe ์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ์ˆœ์„œ๊ฐ€ ์ •ํ•ด์ง„ ๋งค๊ฐœ๋ณ€์ˆ˜์ด๊ธฐ ๋•Œ๋ฌธ์ด์ฃ .

๋ถˆโ€”ํŽธ

aboutMe(, 10) // ์ด๋Ÿฐ๊ฑด ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
aboutMe(10) // ๊ทธ๋ ‡๋‹ค๊ณ  ์ด๋ ‡๊ฒŒ ํ•˜์ž๋‹ˆ name ๋งค๊ฐœ๋ณ€์ˆ˜์— ์ˆซ์ž 10 ์ด ๋“ค์–ด๊ฐ€๋ฒ„๋ฆฝ๋‹ˆ๋‹ค.

๐Ÿคทโ€โ™‚๏ธ ํ•ด๊ฒฐ๋ฒ•์€์š”?

Destructuring Assignment ๋ฅผ ํ™œ์šฉํ•˜๋ฉด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ๋„ Named Parameter ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰ ๋งค๊ฐœ๋ณ€์ˆ˜์— ์ˆœ์„œ๊ฐ€ ์—†์–ด์ง€๊ณ  ์ด๋ฆ„์ด ๋ถ™๊ฒŒ ๋˜๋Š” ๊ฑฐ์ฃ .

์ด ๊ฐœ๋…์€ ๋‹ค์Œ ๋‹จ์›์—์„œ ๋‹ค๋ฃน๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‹ˆ ๋ง›๋ณด๊ธฐ ์ฝ”๋“œ๋งŒ ํ›‘๊ณ  ๋„˜์–ด๊ฐ€ ๋ณด์ฃ .

ํŽธโ€”์•ˆ โœ…

function aboutMe ({ name = '๋น„๊ณต๊ฐœ', age = '๋น„๊ณต๊ฐœ' }) { // '์ˆœ์„œ' ๊ฐ€ ์‚ฌ๋ผ์ง„ ๋งค๊ฐœ๋ณ€์ˆ˜๋“ค ๐Ÿ‘๐Ÿ‘๐Ÿ‘
  console.log(name, age)
}

aboutMe({ name: '์†๋‹น๊ทผ', age: 20 }) // -> ์†๋‹น๊ทผ 20
aboutMe({ age: 20, name: '์†๋‹น๊ทผ' }) // -> ์†๋‹น๊ทผ 20 ... ์‹ฌ์ง€์–ด ๋งค๊ฐœ๋ณ€์ˆ˜ ์ˆœ์„œ๊นŒ์ง€ ๋ฐ”๊ปด๋„ ์ž˜ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค!

aboutMe({ name: '์†๋‹น๊ทผ' }) // -> ์†๋‹น๊ทผ ๋น„๊ณต๊ฐœ ... ๋‚˜์ด๋ฅผ ๋„˜๊ธฐ์ง€ ์•Š์•˜์œผ๋ฏ€๋กœ '๋น„๊ณต๊ฐœ' ๋ฅผ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.
aboutMe({ age: 20 }) // -> ๋น„๊ณต๊ฐœ 20

aboutMe({}) // -> ๋น„๊ณต๊ฐœ ๋น„๊ณต๊ฐœ ... ๋‘˜ ๋‹ค '๋น„๊ณต๊ฐœ' ๋กœ ์ถœ๋ ฅ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค!

Named Parameter

์ •์˜

Named Parameter ๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜์— ์ด๋ฆ„์„ ์ง€์ •ํ•ด์ค๋‹ˆ๋‹ค.

ํ™œ์šฉ1: ์„ ํƒ์  ๋งค๊ฐœ๋ณ€์ˆ˜

๐Ÿ‘‰ ์‹œ๋‚˜๋ฆฌ์˜ค: ๋‚˜์ด์™€ ์ง์—…์„ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ฐ›๊ณ  ์ถœ๋ ฅํ•˜๋Š” ํ•จ์ˆ˜ aboutMe ๋ฅผ ์ž‘์„ฑํ•˜์„ธ์š”.

๐Ÿ‘‰ ์กฐ๊ฑด 1: ๋‚˜์ด๋งŒ ์ž…๋ ฅํ•  ์ˆ˜๋„, ์ง์—…๋งŒ ์ž…๋ ฅํ•  ์ˆ˜๋„, ๋‘˜ ๋‹ค ์ž…๋ ฅํ•  ์ˆ˜๋„ ๊ทธ๋ฆฌ๊ณ  ๋‘˜ ๋‹ค ์ž…๋ ฅ ์•ˆ ํ•  ์ˆ˜๋„ ์žˆ๊ฒŒ ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•˜์„ธ์š”.

๋ถˆโ€”ํŽธ

// ๋งค๊ฐœ๋ณ€์ˆ˜์— ์ˆœ์„œ๊ฐ€ ์ •ํ•ด์ ธ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ๐Ÿ‘Ž
function aboutMe (age, job) {
  age && console.log('๋‚˜์ด', age)
  job && console.log('์ง์—…', job)
}

aboutMe(20) // -> ๋‚˜์ด 20 ... ๋‚˜์˜์ง€ ์•Š์•„ ๋ณด์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋‹ค์Œ ๋ผ์ธ์„ ๋ด๋ณด์„ธ์š”.
// ํ•จ์ˆ˜๊ฐ€ ๊ธฐ๋Œ€ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค!
aboutMe('๊ฐœ๋ฐœ์ž') // -> ๋‚˜์ด ๊ฐœ๋ฐœ์ž ... ๋‚˜์ด๊ฐ€ ๊ฐœ๋ฐœ์ž๋ผ๊ณ  ๋‚˜์™”๊ตฐ์š”. ๐Ÿ‘Ž

ํŽธโ€”์•ˆ โœ…

// Named Parameter ๋•๋ถ„์— ์กฐ๊ฑด์„ ๋งŒ์กฑํ•ฉ๋‹ˆ๋‹ค.
// ์„ ํƒ์ ์œผ๋กœ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ž…๋ ฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๐Ÿ‘
function aboutMe ({ age, job }) {
  age && console.log('๋‚˜์ด', age)
  job && console.log('์ง์—…', job)
}

// ๋‚˜์ด์™€ ์ง์—… ์ค‘ ํ•˜๋‚˜๋งŒ ์ž…๋ ฅ๋„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๐Ÿ‘
aboutMe({ age: 20 }) // -> ๋‚˜์ด 20
aboutMe({ job: '๊ฐœ๋ฐœ์ž' }) // -> ์ง์—… ๊ฐœ๋ฐœ์ž

ํ™œ์šฉ2: ์ˆœ์„œ ์—†๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜

๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ 3๊ฐœ ์ด์ƒ์ด๋ฉด ์ˆœ์„œ๋ฅผ ์ž˜๋ชป ์ž…๋ ฅํ•  ๊ฐ€๋Šฅ์„ฑ์ด ํฝ๋‹ˆ๋‹ค.

ํŠนํžˆ ๋งค๊ฐœ๋ณ€์ˆ˜์— ํƒ€์ž…์„ ์ง€์ • ํ•  ์ˆ˜ ์—†๊ธฐ๋•Œ๋ฌธ์— ์•„๋ฌด๋Ÿฐ ๊ฒฝ๊ณ  ์—†์ด ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜๊ณ , ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ์ผ์ด ๋ฐœ์ƒํ•˜๊ฒ ์ฃ .

์ด๋ฅผ ๋ฐฉ์ง€ํ•˜๋ ค๋ฉด ์ˆœ์„œ ์—†๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ‘‰ ์‹œ๋‚˜๋ฆฌ์˜ค: ์ฐฝ ์ด๋ฆ„, ๊ฐ€๋กœ, ์„ธ๋กœ ์‚ฌ์ด์ฆˆ, ๋ฐฐ๊ฒฝ์ƒ‰, ํ…Œ๋‘๋ฆฌ ์ƒ‰, ํ…Œ๋‘๋ฆฌ ๋‘๊ป˜ ๊ทธ๋ฆฌ๊ณ  ํฐํŠธ๋ฅผ ์ž…๋ ฅ ๋ฐ›์•„ ์ƒˆ๋กœ์šด ์ฐฝ์„ ๋ Œ๋”๋งํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•˜์„ธ์š”.

๋ถˆโ€”ํŽธ

function render (name, width, height, backgroundColor, borderColor, borderWidth, font) {
  // doSomething ...
}

// ๋งค๊ฐœ๋ณ€์ˆ˜ ์ˆœ์„œ๋ฅผ ํ•˜๋‚˜๋ผ๋„ ํ‹€๋ฆฌ๋ฉด ํฐ ์ผ๋‚ฉ๋‹ˆ๋‹ค.
render('์ƒˆ ์ฐฝ', 640, 480, 'red', 'green', 1, 'Apple Bold')

ํŽธโ€”์•ˆ โœ…

function render ({ name, width, height, backgroundColor, borderColor, borderWidth, font }) {
  // doSomething ...
}

// ์ด์ œ ๋งค๊ฐœ๋ณ€์ˆ˜ ์ˆœ์„œ์™€ ์ƒ๊ด€์—†์ด ์•ˆ์ „ํ•˜๊ฒŒ ํ˜ธ์ถœ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๐Ÿ‘
render({
  height: 480,
  borderColor: 'green',
  backgroundColor: 'red',
  font: 'Apple Bold',
  name: '์ƒˆ ์ฐฝ',
  borderWidth: 1,
  width: 640
})

Promise

์ •์˜

Promise ๋Š” ๋น„๋™๊ธฐ ์ž‘์—…์˜ ์ƒํƒœ๋ฅผ ๋ณด๊ด€ํ•˜๊ณ  ์ถ”์ ํ•ฉ๋‹ˆ๋‹ค.

ํŠน์ง• (์ค‘์š” ๐Ÿ‰)

Promise ๋Š” ๋‹ค์Œ ์ค‘ ํ•˜๋‚˜์˜ ์ƒํƒœ๋ฅผ ๊ฐ€์ง‘๋‹ˆ๋‹ค.

  • ๋Œ€๊ธฐ(pending): ์ดํ–‰ํ•˜๊ฑฐ๋‚˜ ๊ฑฐ๋ถ€๋˜์ง€ ์•Š์€ ์ดˆ๊ธฐ ์ƒํƒœ.
  • ์ดํ–‰(fulfilled): ์—ฐ์‚ฐ์ด ์„ฑ๊ณต์ ์œผ๋กœ ์™„๋ฃŒ๋จ.
  • ๊ฑฐ๋ถ€(rejected): ์—ฐ์‚ฐ์ด ์‹คํŒจํ•จ.

[์ถœ์ฒ˜: MDN - Promise]

Promise ๋Š” ์ฃผ์–ด์ง„ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ๋‹จ ํ•œ ๋ฒˆ ์‹คํ–‰ํ•˜๋ฉฐ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๊ด€ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ํŠน์„ฑ ๋•Œ๋ฌธ์— Promise ์˜ ์ƒํƒœ๋Š” ํ•œ ๋ฒˆ ๊ฒฐ์ •๋˜๋ฉด ์ˆ˜์ •๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‹ค์‹œ ๋งํ•ด ์ด๋ฏธ ์†Œ๋น„(์ดํ–‰๋˜๊ฑฐ๋‚˜ ๊ฑฐ๋ถ€) ๋œ Promise ๋Š” ์žฌ์‚ฌ์šฉ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

1. ์„ฑ๊ณต ์ผ€์ด์Šค (fulfilled)

ํ™œ์šฉ 1: ๋น„๋™๊ธฐ ํ˜ธ์ถœ์˜ ์ƒํƒœ๋ฅผ ์ถ”์ ํ•˜๊ธฐ

๐Ÿ‘‰์‹œ๋‚˜๋ฆฌ์˜ค: 3์ดˆ ํ›„ ์ฃผ๋ฌธํ•œ ์Œ์‹์ด ๋ฐฐ๋‹ฌ๋ฉ๋‹ˆ๋‹ค. ๋„์ฐฉ ์‹œ ์ด๋ฅผ ์ถœ๋ ฅํ•˜์„ธ์š”.

๐Ÿ‘‰์กฐ๊ฑด1: ๋ฐฐ๋‹ฌ์ด ๋„์ฐฉํ•˜๊ธฐ ์ „์—๋Š” ์ ˆ๋Œ€๋กœ ๋นจ๋ž˜๋ฅผ ์‹œ์ž‘ํ•˜์ง€ ๋งˆ์„ธ์š”.

๋ถˆโ€”ํŽธ

function delivery () {
  setTimeout(() => { console.log('๋ฐฐ๋‹ฌ ๋„์ฐฉ') }, 3000)
}

// ๋ฐฐ๋‹ฌ์„ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค. (๋น„๋™๊ธฐ ํ•จ์ˆ˜ ํ˜ธ์ถœ)
// ๊ทธ๋Ÿฌ๋‚˜ ๋ฐฐ๋‹ฌ์˜ ํ˜„์žฌ ์ƒํƒœ๋ฅผ ์ถ”์ ํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.
delivery() 
console.log('๋นจ๋ž˜ ์‹œ์ž‘')

// ๊ฒฐ๊ณผ ๐Ÿ‘Ž
// -> ๋นจ๋ž˜ ์‹œ์ž‘ ... ๋ฐฐ๋‹ฌ์ด ๋„์ฐฉํ•˜๊ธฐ๋„ ์ „์— ๋นจ๋ž˜๋ฅผ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค.
// -> ๋ฐฐ๋‹ฌ ๋„์ฐฉ

ํŽธโ€”์•ˆ โœ…

function delivery () {
  return new Promise((resolve) => {
    setTimeout(() => {
      console.log('๋ฐฐ๋‹ฌ ๋„์ฐฉ')
      resolve()
    }, 3000)
  })
}

delivery().then(() => {
  console.log('๋นจ๋ž˜ ์‹œ์ž‘') // ๋ฐฐ๋‹ฌ์ด ๋„์ฐฉ ํ•œ ํ›„ ๋นจ๋ž˜๋ฅผ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.
})

// ๊ฒฐ๊ณผ ๐Ÿ‘
// -> ๋ฐฐ๋‹ฌ ๋„์ฐฉ
// -> ๋นจ๋ž˜ ์‹œ์ž‘

2. ์‹คํŒจ ์ผ€์ด์Šค (rejected)

๐Ÿ‘‰์‹œ๋‚˜๋ฆฌ์˜ค: 3์ดˆ ํ›„ ์ฃผ๋ฌธํ•œ ์Œ์‹์ด ๋ฐฐ๋‹ฌ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์›”์š”์ผ์€ ํœด๋ฌด์ž…๋‹ˆ๋‹ค.

๐Ÿ‘‰์กฐ๊ฑด1: ํœด๋ฌด์ผ์—๋Š”(๋ฐฐ๋‹ฌ ๊ฑฐ๋ถ€ ์‹œ) ๋งฅ๋„๋‚ ๋“œ์— ๋ฐฉ๋ฌธํ•˜์„ธ์š”.

ํŽธโ€”์•ˆ โœ…

function delivery (day) {
  return new Promise((resolve, reject) => {
    if (day === '์›”์š”์ผ') {
      reject(new Error())
    }

    setTimeout(() => {
      resolve()
    }, 3000)
  })
}

delivery('์›”์š”์ผ').then(() => {
  console.log('์Œ์‹ ๋ฐ›๊ธฐ')
}).catch(() => {
  console.log('๋งฅ๋„๋‚ ๋“œ ๋ฐฉ๋ฌธํ•˜๊ธฐ')
})

// ๊ฒฐ๊ณผ ๐Ÿ‘
// -> ๋งฅ๋„๋‚ ๋“œ ๋ฐฉ๋ฌธํ•˜๊ธฐ

3. ์ผํšŒ์„ฑ

Promise ๋Š” ๋น„๋™๊ธฐ ํ•จ์ˆ˜ ํ˜ธ์ถœ์˜ ๊ฒฐ๊ณผ๋ฅผ ์ •ํ™•ํžˆ ๋ณด๊ด€ํ•  ์˜๋ฌด๋ฅผ ๊ฐ€์ง‘๋‹ˆ๋‹ค. ํ•œ ๋ฒˆ ์ •ํ•ด์ง„ ๊ฒฐ๊ณผ๋Š” ์ˆ˜์ •๋˜์ง€ ์•Š์œผ๋ฉฐ ์ด๋ฅผ ์ง€ํ‚ค๊ธฐ ์œ„ํ•ด์„œ ์ฃผ์–ด์ง„ ์‹คํ–‰ ํ•จ์ˆ˜(executor)๋ฅผ ๋‹จ ํ•œ ๋ฒˆ๋งŒ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ‘‰์‹œ๋‚˜๋ฆฌ์˜ค: Promise ๊ฐ€ ์ผํšŒ์„ฑ์ด๋ผ๋Š” ๊ฒƒ์„ ์ฆ๋ช…ํ•˜์„ธ์š”.

// new Promise ๋ฅผ ํ•œ์ˆœ๊ฐ„ ์ด๋ฏธ ํ”„๋กœ๋ฏธ์Šค ์†Œ์ง„
const promise = new Promise((resolve) => {
  console.log('์•ˆ๋…•')
  resolve()
})

promise.then()
promise.then()
promise.then()

// ๊ฒฐ๊ณผ ๐Ÿ‘
// -> ์•ˆ๋…• ... ๋‹จ ํ•œ ๋ฒˆ ์ถœ๋ ฅ๋จ

Async Function

์ •์˜

Promise ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜

ํŠน์ง•

Async Function ์€ await ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉ ๊ฐ€๋Šฅ์ผ€ ํ•ด์ค๋‹ˆ๋‹ค. await ํ‚ค์›Œ๋“œ๋Š” Async Function ์—์„œ๋งŒ ์œ ํšจํ•ฉ๋‹ˆ๋‹ค.

await ํ‚ค์›Œ๋“œ๋Š” Async Function ์ด ๋๋‚˜๊ธธ(return or throw) ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค.

Async Function ๋Š” return ํ˜น์€ throw ๋ฌธ์œผ๋กœ ๋๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Async/Await ์„ ์‚ฌ์šฉํ•˜๋ฉด ์ผ๋ จ์˜ ๋น„๋™๊ธฐ ์ž‘์—…์„ ๋น„๊ต์  ์‰ฝ๊ฒŒ ๋™๊ธฐ ๋ฐฉ์‹์œผ๋กœ ํ˜ธ์ถœ ๊ฐ€๋Šฅ์ผ€ ํ•ด์ค๋‹ˆ๋‹ค.

์ฐธ๊ณ 

์˜ˆ์‹œ ์ฝ”๋“œ๋“ค์€ ๊ฐ„๊ฒฐํ•œ ์ฝ”๋“œ๋ฅผ ๋ณด์—ฌ์ฃผ๊ธฐ ์œ„ํ•ด top-level-await ๊ธฐ๋Šฅ์ด ํƒ‘์žฌ๋œ ํ™˜๊ฒฝ์—์„œ ์ง„ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค. top-level-await ์€ ECMAScript proposal stage 3 ์ƒํƒœ๋ฉฐ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์•„๋ž˜ ๋งํฌ๋ฅผ ์ฐธ๊ณ ํ•ด ์ฃผ์„ธ์š”.

tc39/proposal-top-level-await - GitHub

1. ๋น„๋™๊ธฐ ์ž‘์—…ํ•˜๊ธฐ

๐Ÿ‘‰์‹œ๋‚˜๋ฆฌ์˜ค: ๊ตฌ๊ธ€ ๊ฒ€์ƒ‰ ํŽ˜์ด์ง€๋ฅผ ํฌ๋กค๋ง ํ•ด์˜ค์„ธ์š”. ํฌ๋กค๋ง์„ ์™„๋ฃŒํ•˜๋Š” ๊ฒƒ์„ ๊ธฐ๋‹ค๋ฆฌ์ง€ ๋ง๊ณ  ์ด๋ฉ”์ผ์„ ์ „์†ก ํ•˜์„ธ์š”.

๐Ÿ‘‰์กฐ๊ฑด: Async Function ์„ ํ™œ์šฉํ•˜์„ธ์š”.

ํŽธโ€”์•ˆ โœ…

async function google () {
  // ...
  console.log('๊ตฌ๊ธ€ ํฌ๋กค๋ง ์™„๋ฃŒ')
}

google() // ๋น„๋™๊ธฐ์ ์œผ๋กœ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
console.log('์ด๋ฉ”์ผ ์ „์†ก')

// ๊ฒฐ๊ณผ ๐Ÿ‘
// -> ์ด๋ฉ”์ผ ์ „์†ก
// -> ๊ตฌ๊ธ€ ํฌ๋กค๋ง ์™„๋ฃŒ

2. ๋น„๋™๊ธฐ ์ž‘์—…์„ ๊ธฐ๋‹ค๋ฆฌ๊ธฐ

๐Ÿ‘‰์‹œ๋‚˜๋ฆฌ์˜ค: ๊ตฌ๊ธ€ ๊ฒ€์ƒ‰ ํŽ˜์ด์ง€๋ฅผ ํฌ๋กค๋ง ํ•ด์˜ค์„ธ์š”. ํฌ๋กค๋ง์„ ์™„๋ฃŒํ•œ ๋’ค ์ด๋ฉ”์ผ์„ ์ „์†ก ํ•˜์„ธ์š”.

๐Ÿ‘‰์กฐ๊ฑด: Async Function ์„ ํ™œ์šฉํ•˜์„ธ์š”.

ํŽธโ€”์•ˆ โœ…

async function google () {
  // ...
  console.log('๊ตฌ๊ธ€ ํฌ๋กค๋ง ์™„๋ฃŒ')
}

await google() // await ํ‚ค์›Œ๋“œ๊ฐ€ ๋™๊ธฐ์ ์œผ๋กœ ์‹คํ–‰ํ•˜๋„๋ก ๋งŒ๋“ค์–ด์ค๋‹ˆ๋‹ค. ๐Ÿ‘
console.log('์ด๋ฉ”์ผ ์ „์†ก')

// ๊ฒฐ๊ณผ ๐Ÿ‘
// -> ๊ตฌ๊ธ€ ํฌ๋กค๋ง ์™„๋ฃŒ
// -> ์ด๋ฉ”์ผ ์ „์†ก

3. ๊ฒฐ๊ณผ ๋‹ค๋ฃจ๊ธฐ

ํ™œ์šฉ 1: ์„ฑ๊ณต (return)

๐Ÿ‘‰์‹œ๋‚˜๋ฆฌ์˜ค: getUser ํ•จ์ˆ˜๋กœ ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ค์„ธ์š”. ๊ฒฐ๊ณผ๋ฅผ ๋ฐ›์•„ name ํ•„๋“œ์˜ ๊ฐ’์„ ์ถœ๋ ฅํ•˜์„ธ์š”.

๐Ÿ‘‰์กฐ๊ฑด: await ํ‚ค์›Œ๋“œ๋กœ getUser ํ•จ์ˆ˜๊ฐ€ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฐ’์„ ๋ฐ›์•„์˜ค์„ธ์š”.

ํŽธโ€”์•ˆ โœ…

async function getUser () {
  const result = await dbQuery()
  return result
}

const user = await getUser() // await ํ‚ค์›Œ๋“œ๊ฐ€ getUser ํ•จ์ˆ˜์˜ ๋ฐ˜ํ™˜์„ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค. ๐Ÿ‘

console.log(user.name)

ํ™œ์šฉ2: ์‹คํŒจ (throw)

๐Ÿ‘‰์‹œ๋‚˜๋ฆฌ์˜ค: ๋ฐฐ๋‹ฌ ์Œ์‹์„ ์ฃผ๋ฌธํ•˜์„ธ์š”. ๋ฐฐ๋‹ฌ์ด ๋„์ฐฉํ•˜๋ฉด(return) ์Œ์‹์„ ๋จน๊ณ , ๋งŒ์•ฝ ์ฃผ๋ฌธ์ด ์ทจ์†Œ๋˜๋ฉด(throw) ๋ฐฉ๋ฌธ ํฌ์žฅ์„ ํ•ด์˜ค์„ธ์š”.

ํŽธโ€”์•ˆ โœ…

async function delivery () {
  // ...
  throw new Error('์ฃผ๋ฌธ ์ทจ์†Œ!')
}

try {
  await delivery() // await ํ‚ค์›Œ๋“œ๊ฐ€ ๋•๋ถ„์— ๋น„๋™๊ธฐ ํ˜ธ์ถœ์˜ ์‹คํŒจ๋ฅผ ๋‹ค๋ฃฐ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๐Ÿ‘
  // ... ๋ฐฐ๋‹ฌ ์Œ์‹ ๋จน๊ธฐ
} catch (error) {
  // ... ๋ฐฉ๋ฌธ ํฌ์žฅ ํ•ด์˜ค๊ธฐ
}
Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].