본문으로 건너뛰기
yceffort
PostsSeriesTagsAbout🧪 Research
EN

Tweaks

theme
accent palette
film grain
minimal mode
BACK TO INDEX
◆ ESSAY
--min
--year
KOoriginal

mailMail icongithubtwitter
yceffort
•
© 2026
•
https://yceffort.kr
BACK TO INDEX
◆ ESSAY

Javascript - Destructuring Assignment

avatar
yceffort
2019-05-21 · 3분
3min
2019year
KOoriginal
javascript

구조 분해 할당

구조 분해 할당은 배열이나 객체의 속성을 말그대로 분해하여, 분해 한 값을 개별변수에 담을 수 있게 도와주는 표현식이다.

let a, b, rest
;[a, b] = [10, 20]
console.log(a) // 10
console.log(b) // 20

// rest 패턴을 이용하여 나머지를 모두 할당 받을 수 있다.
;[a, b, ...rest] = [10, 20, 30, 40, 50]
console.log(a) // 10
console.log(b) // 20
console.log(rest) // [30, 40, 50]

// 객체 리터럴 식에서 구조 분해 할당을 하기 위해서는, 객체 리터럴 형식과 마찬가지로 { }로 표기하면 된다.
;({a, b} = {a: 10, b: 20})
console.log(a) // 10
console.log(b) // 20
;({a, b, ...rest} = {a: 10, b: 20, c: 30, d: 40})
console.log(a) // 10
console.log(b) // 20
console.log(rest) // {c: 30, d: 40}

function f() {
  return [1, 2]
}

var a, b
;[a, b] = f()
console.log(a) // 1
console.log(b) // 2

// 값을 아래 처럼 무시할 수도 있다.
function f() {
  return [1, 2, 3]
}

var [a, , b] = f()
console.log(a) // 1
console.log(b) // 3

객체 구조 분해

var o = {p: 42, q: true}
var {p, q} = o

console.log(p) // 42
console.log(q) // true

var o = {p: 42, q: true}
var {p: foo, q: bar} = o

// p와 q는 무시된다.
console.log(foo) // 42
console.log(bar) // true

var metadata = {
  title: 'Scratchpad',
  translations: [
    {
      locale: 'de',
      localization_tags: [],
      last_edit: '2014-04-14T08:43:37',
      url: '/de/docs/Tools/Scratchpad',
      title: 'JavaScript-Umgebung',
    },
  ],
  url: '/en-US/docs/Tools/Scratchpad',
}

var {
  title: englishTitle,
  translations: [{title: localeTitle}],
} = metadata

console.log(englishTitle) // "Scratchpad"
console.log(localeTitle) // "JavaScript-Umgebung"

var people = [
  {
    name: 'Mike Smith',
    family: {
      mother: 'Jane Smith',
      father: 'Harry Smith',
      sister: 'Samantha Smith',
    },
    age: 35,
  },
  {
    name: 'Tom Jones',
    family: {
      mother: 'Norah Jones',
      father: 'Richard Jones',
      brother: 'Howard Jones',
    },
    age: 25,
  },
]

for (var {
  name: n,
  family: {father: f},
} of people) {
  console.log('Name: ' + n + ', Father: ' + f)
}

function userId({id}) {
  return id
}

function whois({displayName: displayName, fullName: {firstName: name}}) {
  console.log(displayName + ' is ' + name)
}

// "Name: Mike Smith, Father: Harry Smith"
// "Name: Tom Jones, Father: Richard Jones"

var user = {
  id: 42,
  displayName: 'jdoe',
  fullName: {
    firstName: 'John',
    lastName: 'Doe',
  },
}

console.log('userId: ' + userId(user)) // "userId: 42"
whois(user) // "jdoe is John"

let key = 'z'
let {[key]: foo} = {z: 'bar'}

console.log(foo) // "bar"
{
  innerHeight
} // {innerHeight: 441}
{
  innerHeight
} // 441

여기에서 //는 전역객체 window일 것이다.

객체 리터럴 표기법과 JSON의 차이

  • JSON은 "key": value 구문만 허용한다. key값은 큰 따옴표로 묶여 있어야한다. 그리고 값은 단축(명)일 수는 없다.
  • JSON에서 값은 문자열, 숫자, 배열, true, false, null또는 다른 JSON객체만 가능하다.
  • 함수는 JSON값에서 할당될 수 없다.
  • Date 객체는 JSON.parse()를 거치고 나면 문자열이 된다.

관련 글

  • #turbopack#nextjs#bundler

    Next.js turbopack에서 싱글톤이 두 개가 됐다: scope hoisting 버그와 순환 import

    Next.js 16 turbopack 프로덕션 빌드에서 모듈 스코프 싱글톤이 런타임에 두 개가 됐다. 같은 동기 구간에서 조건 판정이 뒤집히고, 응답이 도착해도 타임아웃이 나는 증상을 번들 산출물로 추적한 기록. scope hoisting의 부분 병합, 순환 import, 이미 고쳐져 있던 upstream 버그, 그리고 뒤늦게 돌린 단일 변수 실험까지.

    2026-08-19·28분
  • #javascript#animation#web-animations-api

    number-flow를 구형 브라우저로 이식하기: 다섯 가지 결정과 두 가지 번복

    number-flow가 애니메이션을 켜는 최소 버전은 Chrome 125, Safari 17.2다. 이 하한을 Chrome 66과 WebKit 16.4까지 내리는 포크를 만들면서 내린 결정들과, 뒤집게 된 판단 두 가지, 그리고 자동 강등을 포기한 Safari 버그 조사의 기록.

    2026-08-11·44분
  • #nodejs#security#javascript

    Node.js vm 모듈의 함정: 샌드박스가 아닌 이유

    집필 중인 Node.js Deep Dive의 5.2장(vm 모듈의 함정) 일부를 미리 공개합니다.

    2026-02-27·25분
  • #nodejs#javascript

    Node.js Deep Dive (가제) 베타 리더를 모십니다.

    많관부22

    2026-02-19·5분

새 글을 놓치고 싶지 않으시다면 RSS로 구독해 주세요.

RSS 구독 →

yceffort — 프론트엔드 엔지니어입니다. 발표·기술 자문·기고 문의는 이곳에서 받고 있습니다.

← Back to the blogIssue on GitHub →