什么是解构赋值呢?
ES6 允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构。
如下所示:
let [a, b, c] = [1, 2, 3];let [ , , third] = ["foo", "bar", "baz"];let [x, , y] = [1, 2, 3];let [head, ...tail] = [1, 2, 3, 4];let [x, y] = [1, 2, 3];
解构赋值还可以设定默认值,我们来看下面的几个例子:
let [foo = true] = []; foo // truelet [x, y = 'b'] = ['a']; // x='a', y='b' let [x, y = 'b'] = ['a', undefined]; let [x = 1] = [undefined]; x let [x = 1] = [null]; x
如果解构的默认值是一个函数,那么可以触发惰性赋值:
function f() { console.log('aaa'); } let [x = f()] = [1];
上面的例子中,f函数将不会被执行。
除了解构变量之外,还可以解构对象:
let { bar, foo } = { foo: "aaa", bar: "bbb" }; foo // "aaa" bar // "bbb" let { baz } = { foo: "aaa", bar: "bbb" }; baz var { foo: baz } = { foo: 'aaa', bar: 'bbb' }; baz // "aaa" let obj = { first: 'hello', last: 'world' }; let { first: f, last: l } = obj; f // 'hello' l // 'world'
解构还支持嵌套的结构:
let obj = { p: [ 'Hello', { y: 'World' } ] }; let { p: [x, { y }] } = obj; x // "Hello" y // "World"
解构赋值有两个非常重要的作用。
第一就是交换变量:
let x = 1; let y = 2; [x, y] = [y, x];
我们就可以不再使用中间变量,直接进行两个变量值的交互。
第二个作用就是从函数中返回多个值:
function example() { return [1, 2, 3]; } let [a, b, c] = example(); function example() { return { foo: 1, bar: 2 }; } let { foo, bar } = example(); let jsonData = { id: 42, status: "OK", data: [867, 5309] }; let { id, status, data: number } = jsonData;