美文网首页
2019-01-15

2019-01-15

作者: kathyever | 来源:发表于2019-01-15 15:58 被阅读0次

变量的解构赋值

1、数组的解构赋值

基本用法

ES6允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构。

//以前为变量赋值只能直接指定值
let a=1;
let b=2;
let c=3;

//ES6
let [a,b,c] = [1,2,3];

本质上这种写法属于“模式匹配”,只要等号两边的模式相同,左边的变量就会被赋予对应的 值。

let [foo,[[bar],baz]] = [1,[[2],3]];
foo//1
bar//2
baz//3

let [head,...tail] = [1,2,3,4]
head//1
tail//[2,3,4]

let[x,y,...z] = ['a'];
x//"a"
y//undefined
z//[ ]

如果解构不成功,变量的值就等于undefined

另一种情况是不完全解构,即等号左边的模式,只匹配一部分的等号右边的数组。这种情况下,解构依然可以成功

let [x,y]=[1,2,3];
x//1
y//2

let[a,[b],d]=[1,[2,3],4];
a//1
b//2
d//4

//以上都属于不完全解构但是可以成功

如果等号的右边不是数组,那么将会报错

//报错
let [foo]=1;
let [foo] =false;
let [foo] =NaN;
let [foo] =undefined;
let [foo] = null;
let [foo] = { };


// 对于Set解构,也可以使用数组的解构赋值
let [x,y,z]=new Set(['a','b','c']);

//事实上,只要某种数据结构具有Iterator接口,都可以采用数组形式的解构赋值
function*fibs(){
    let a=0;
    let b=1;
    while(true){
        yield a;
        [a,b]=[b,a+b];
    }
}
let [first,second,third,fourth,fifth,sixth]=fibs();
sixth //5

默认值

解构赋值允许指定默认值

let [foo=true]=[];
foo //true

let [x,y='b'] = ['a'];//x='a'.y='b'
let [x,y='b'] = ['a',undefined];//x='a',y='b'

ES6内部使用严格相等运算符(===),判断一个位置是否有值。所以,只有当一个数组成员严格等于undefined,默认值才会生效。

let [x=1] = [undefined];
x//1

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

//如果一个数组成员是null,默认值就不会生效,因为null不严格等于undefined

默认值可以引用解构赋值的其他变量,但该变量必须已经声明

let [x=1,y=x] = [ ];//x=1,y=x
let [x=1,y=x] = [2];//x=2,y=2
let [x=1,y=x] = [1,2];//x=1,y=2
let [x=y,y=1] =[ ];//ReferenceError: y is not defined,因为x用y做默认值时,y还没有声明。

相关文章

网友评论

      本文标题:2019-01-15

      本文链接:https://www.haomeiwen.com/subject/icdedqtx.html