ES6--解构赋值

解构赋值:按照一定的模式,从数组和对象中提取值,对声明的变量进行赋值;如果被提取的不是数组或对象,则先转化成数组或对象。

数组的解构赋值

完全解构:等号左右两侧模式完全匹配,并且取值时,按照数组的次序排列。

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

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

let [, , c] = ['1', '2', '3']
// c=3

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

let [a, ...b] = ['1', '2', '3'];
// a=1 b=['2', '3']

let [a, b, ...c] = ['1']; 
// a=1 b=undefined c=[]

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

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

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

解构失败:如果解构不成功,则变量值为undefined; 等号右边若不是数组,或不能转化成可迭代的对象,则会报错

let [a] = [];
let [b, a] = [1];
// a=undefined

let [foo] = 1;
let [foo] = false;
let [foo] = NaN;
let [foo] = undefined;
let [foo] = null;
let [foo] = {};
// 报错
对象的解构赋值

不需要按照次序排序,变量名与要匹配的对象属性名一致即可,若被匹配的对象中没有要声明的变量的同名属性,则会报错;先找到同名属性,然后再赋给对应的变量,真正被赋值的是后者,而不是前者。

let {foo: foo, bar: bar} = {foo: 'aaa', bar: 'bbb'}
// 定义变量foo、bar,匹配对象中的属性为foo和bar的value值。等号左边foo是匹配的模式,baz才是变量

let {foo, bar} = {foo: 'aaa', bar: 'bbb'}
// 若变量名与属性名一致,则可以省略

let { foo: baz } = { foo: 'aaa', bar: 'bbb' };
// 定义一个变量bar,匹配对象中的foo的值

Object.setPrototypeOf(obj1, obj2);
// 把obj2对象设置成obj1对象的原型,对象的解构赋值可以取到继承的属性

对象解构赋值时,被匹配的对象可以是一个数组:

let arr = [1, 2, 3];
let {0 : first, [arr.length - 1] : last} = arr;
// first=1 last=3
字符串的解构赋值

字符串也可以解构赋值,这是因为此时,字符串被转换成了一个类似数组的对象。

const [a, b, c, d, e] = 'hello';
//a="h" b="e" c="l" d="l" e="o"
 函数参数的解构赋值

函数的参数为解构赋值中被赋值的变量,调用函数的传参为解构赋值中被匹配的对象,函数的参数可以是字符串、数字、布尔类型、数组、对象。

function add([x, y]){
    return x + y;
}
add([1, 2]); // 3

函数参数的默认值:

// 函数参数的解构赋值的默认值:若调用函数时没有参数,则使用等号左边变量的默认值;
function move({x = 0, y = 0} = {}) {
    return [x, y];
}

move({x: 3, y: 8}); // [3, 8]
move({x: 3}); // [3, 0]
move({}); // [0, 0]
move(); // [0, 0]

// 函数参数的解构赋值的默认值:若调用函数时没有参数,则使用等号右边参数的默认值;
function move({x, y} = { x: 0, y: 0 }) {
    return [x, y];
}

move({x: 3, y: 8}); // [3, 8]
move({x: 3}); // [3, undefined]
move({}); // [undefined, undefined]
move(); // [0, 0]
圆括号的使用

可以使用圆括号的情况:赋值语句的非模式部分(对象赋值时,必须要在赋值语句外面加括号)

[(b)] = [3]; // 正确
({ p: (d) } = {}); // 正确
[(parseInt.prop)] = [3]; // 正确

转载于:https://www.cnblogs.com/britney/p/11277702.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值