合理使用ES6中变量的结构赋值会改变代码的整洁度和流畅性。
- 数组的结构赋值
let obj = {name: 'li'};
let [a, b, c] = [1, 2, 3];
let [head, ...tail] = [1, 2, 3, 4]; //head: 1, tail: [2, 3, 4];
let [a, b, c] = [2, [1, 2], 3]; // a: 2, b: [1, 2], c:3
let [foo = true] = []; //可以设置默认值:foo: true
let [a , b = a.name] = [obj]; //a: {name: 'li'}, b: 'li' //连环取值
1.如果结构赋值不成功,变量值就等于
undefined
2.只要某种数据结构具有Iterator
接口,都可以采用数组形式的结构赋值
3.在设置默认值时,ES6内部使用===
和undefined
做判断,确定一个位置是否有值
4.虽然数组的结构赋值可以嵌套,但是为了确保易读性, 要控制嵌套层级
-
对象的结构赋值
let obj = {p: ['hello', {y: 'world'}]} let {foo, bar} = {foo: 'aaa', bar: 'bbb'}; //foo: 'aaa', bar: 'bbb' let {foo: FOO, bar: BAR} = {foo: 'aaa', bar: 'bbb'}; // FOO: 'aaa'. BAR: 'bbb' let {p:[x, {y}]} = obj; // x: 'hello', y : 'world' let {x = 3} = {}; //x: 3
1.在设置默认值时,ES6内部使用===和undefined做判断,确定一个位置是否有值
2.虽然对象的结构赋值可以嵌套,但是为了确保易读性, 要控制嵌套层级
-
函数参数的结构赋值
function move1({x=0, y=0} = {}) { return [x, y]; } function move2({x, y} = {x: 0, y: 0}) { return [x, y]; }
以上两种写法是有区别的:
move1的参数是一个对象,通过对这个对象的结构赋值,得到x和y的值;
move2的参数时就是单独的x和y,你传入一个对象参数后,x、y通过结构解析,获得相应的值;
可以通过一下调用的不同深刻理解:
move1({x: 3}); // [3, 0]
move2({x: 3}); // [3, undefined]
move1({}); //[0, 0];
move2({}); //[undefined, undefined]
- 其他问题
除上述常用赋值形式外,还有字符串、数值、布尔值的结构赋值,这些比较简单,如有用到可自行查询。
结构赋值的解析有一定的复杂性,有时要利用圆括号避免歧义。但是什么时候添加圆括号也是意见麻烦的事情,所以应尽量避免造成这种情况。
网友评论