解构赋值
解构赋值允许指定默认值
但只有当一个数组成员严格等于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)
对象的解构赋值
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'
对象obj1以obj2为原型对象,foo属性不是obj1自身的属性,而是继承自obj2的属性。
注意点
- 将一个已经声明的变量用于解构赋值:
let x
{x} = {x: 1}
/* 相当于{x}
= {x: 1} */
// SyntaxError: syntax error
JS引擎将{x}理解成一个代码块,所以会报错;只有不将大括号写在行首,避免被理解为代码块,才能解决。
let x
({x} = {x: 1})
- 解构赋值允许等号左边的模式之中,不放置任何变量名。
({} = [true, false]);
- 字符串也可以解构赋值,类似数组的对象都有
length属性,可以对该属性解构赋值。
let {length : len} = 'hello';
len // 5
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