变量的解构赋值
解构的默认值
let [foo=true]=[]
console.log(foo)//true
let [a,b="JSPang"]=['技术胖']
console.log(a+b); //控制台显示“技术胖JSPang”
undefined不会赋值
let [a,b="JSPang"]=['技术胖',undefined];
console.log(a+b); //控制台显示“技术胖JSPang”
null会赋值
let [a,b="JSPang"]=['技术胖',null];
console.log(a+b); //控制台显示“技术胖null”
对象的解构赋值
let { foo: baz } = { foo: 'aaa', bar: 'bbb' };
baz // "aaa"
foo // error: foo is not defined
上面代码中,foo是匹配的模式,baz才是变量。真正被赋值的是变量baz,而不是模式foo
这时p是模式,不是变量,因此不会被赋值。如果p也要作为变量赋值,可以写成下面这样,把p单独写出来:
let obj = {
p: [
'Hello',
{ y: 'World' }
]
};
let { p, p: [x, { y }] } = obj;
x // "Hello"
y // "World"
p // ["Hello", {y: "World"}]
字符串的解构赋值
字符串被转换成类似数组的对象
const [a,b,c,d,e]='hello'
a // "h"
b // "e"
c // "l"
d // "l"
e // "o"
对属性解构赋值
let {length:len}='hello'
len//5
解构赋值的规则是,只要等号右边的值不是对象或数组,就先将其转为对象。由于undefined和null无法转为对象,所以对他们进行解构赋值会报错:
let {prop:x}=undefined
let {prop:y}=null
圆括号的使用
赋值语句的非模式部分,可以使用圆括号
[(b)]=[3]
({p:(d)}={})
在解构之前就定义了变量:
let foo
({foo}={foo:'JSPang'})