学习笔记: es6第三版 作者:阮一峰
一. 什么是解构?
按照一定模式从数组和对象中提取值,然后对变量进行赋值, 只要等号两边模式相同,左边的变量会被赋予对应的值。解构不成功的变量,变量值等于undefined. 当前内容是数组形式的解构赋值。
- 示例一
// 以前
let a = 1;
let b = 2;
let c = 3;
a; // a;
typeof a; // number
// es6
let [t1,t2,t3] = [1,2,3];
t1; // 1
typeof t1; // number
- 示例二
let [foo, [[bar], baz]] = [[1],[[2], 3]];
foo; // [1]
typeof foo; // object
bar; // 2
typeof bar; // number
baz; // 3
typeof baz; // number
- 实例三:直接逗号分开变量
let [,, third] = ['foo', 'bar', 'baz'];
third; // baz
- 实例四:…表示变量为数组
let [head, ...tail] = [1,2,3,4]; // '...' 表示数组
head; // 1
tail; // [2,3,4]
- 示例五:解构不成功,一般变量,值等于undedined;有…的变量为[]
let [x,y,...z] = ['a']; // '...'表示数组
x; // a
y; // undefined // 解构不成功,变量的值等于undefined
z; // []
- 示例六:以下两种情况,foo都属于解构不成功,foo的值都为undefined
let [foo] = []; // foo为undefined
let [bar, foo] = [1]; // foo为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] = {};
二. 使用需要特别注意(重要)
- 解构赋值允许指定默认值
let [foo] = []; // 解构失败,foo为undefined
let [foo = true] = []; // 解构成功, foo为true
foo;// true
let [x, y='b'] = ['a'];
x; // a
y; // b
let [x, y='b'] = ['a', undefined];
x; // a
y; // b
let [x,y='b'] = ['a', 'c'];
x;// a
y;// c
- es6内部使用严格相等运算符(===) 判断一个位置是否有值,所以一个数组成员不严格等于undefined, 默认值不会生效。
let [x=1] = [undefined]; // x:1
let [x=1] = [null]; // x:null
let [x=1,y, z] = [null,,2,3]; // x1=null,y=2,z=3
- 默认值可以引用解构赋值的其他变量,但该变量必须已经声明
let [x = 1, y=x] = []; // x=1, y=1
let [x=1, y=x] = [2]; // x=2, y=2
let [x=1, y=x] = [1,2]; // x=1, y=2
let [x=y1, y=1] = []; //Uncaught ReferenceError: y is not defined, x用到y默认值时,y还未声明