ES6 解构赋值

56 阅读2分钟

解构赋值

解构赋值允许指定默认值

但只有当一个数组成员严格等于undefined,默认值才会生效。

let [x = 10] = []
x // 10

let [x, y = 123] = ['a', undefined] // x='a', y=123

如果数组成员是null,默认值变化生效,因为null不严格等于undefined

let [x = 1] = [null]
x // null

如果默认值是一个表达式,那么这个表达式是惰性求值,只有在用到时,才会求值。

function f() {
    console.log('aaa')
}
let [x = f()] = [1]
x // 1

因为x能取到值,所以函数f不会执行。

function f() {
    console.log('aaa')
}
let [x = f()] = [undefined]
console.log(x)

0dac65a6b1b4fe6c60887e5ca8580da.png

对象的解构赋值

let {foo: baz} = {foo: 'aaa', bar: 'bbb'}
baz // 'aaa'
foo // error: foo is not defined

foo是匹配模式,baz是变量。真正被赋值的是baz,而不是模式foo。 对象的解构赋值可以取到继承的属性。

const obj1 = {}
const obj2 ={foo: 'bar'}
// Object.setPrototypeof(obj, prototype): obj是要设置其原型的对象;prototype是该对象的新原型
Object.setPrototypeof(obj1, obj2)
const {foo} = obj1
foo // 'bar'

对象obj1obj2为原型对象,foo属性不是obj1自身的属性,而是继承自obj2的属性。

注意点

  1. 将一个已经声明的变量用于解构赋值:
let x
{x} = {x: 1}
/* 相当于{x}
         = {x: 1} */
// SyntaxError: syntax error

JS引擎将{x}理解成一个代码块,所以会报错;只有不将大括号写在行首,避免被理解为代码块,才能解决。

let x
({x} = {x: 1})
  1. 解构赋值允许等号左边的模式之中,不放置任何变量名。
({} = [true, false]);
  1. 字符串也可以解构赋值,类似数组的对象都有length属性,可以对该属性解构赋值。
let {length : len} = 'hello';
len // 5
  1. Map配合解构赋值,用for... of遍历获取键名和键值。
const map =new Map()
map.set('first', 'Hello')
map.set('second', 'bye')
for(let [key, value] of map){
    console.log(key + 'is' + value)
}
// first is Hello
// second is bye