一文搞懂ES6解构

ES6的解构赋值允许开发者更方便地从数组或对象中提取数据,无需中间变量。它支持数组和对象的解构,可以用于声明和赋值,甚至处理动态属性。解构赋值在变量交换、映射数据等方面提供了简洁的语法,但要注意解构不会解除引用类型的双向绑定,修改副本会影响原始值。
摘要由CSDN通过智能技术生成

ES6引入了一个新的语法特性,名为解构(destructuring),把这个功能可以看作是一个结构化赋值(structured assignment)方法。

1 解构简介

1.1 考虑下面的场景:给a,b,c赋值需要借用一个中间变量tmp

function foo() {
    return [1,2,3];
}
var tmp = foo(),a = tmp[0], b = tmp[1], c = tmp[2];
console.log( a, b, c ); // 1 2 3

1.2 有了数组解构后,代码可简化为下列代码,无需再借用中间变量

var [a,b,c]=foo()
console.log(a,b,c)// 1 2 3

1.3除了数组可以解构外,对象也可以解构,示例如下

function bar() {
    return {
        x: 4,
        y: 5,
        z: 6
    }
}
var {x:xx,y:yy,z:zz}=bar()//解构
console.log( xx, yy, zz );// 4 5 6

解释:var{x:xx,y:yy,z:zz}=bar(),其中x是源字段,是bar()中返回的字段;xx是目标字段,即将bar()中x的值赋值给字段xx。当然我们可以取bar()中的部分字段,例如var{x:xx,y:yy}=bar(),这样,一行解构语句即可实现提取所需字段且赋值给指定变量的功能。very nice!

2.解构是一个通用的赋值操作

2.1 解构不仅可以声明和赋值同时进行,也可以先声明变量,解构用于赋值

var a, b, c, x, y, z;
[a, b, c] = foo();
( { x, y, z } = bar() );//
console.log( a, b, c );// 1 2 3
console.log( x, y, z );/ 4 5 6

特别对于对象解构形式来说,如果省略了var/let/const声明符,就必须把整个赋值表达式用( )括起来。因为如果不这样做,语句左侧的{..}作为语句中的第一个元素就会被当作是一个块语句而不是一个对象。实际上,赋值表达式(a、y等)并不必须是变量标识符。

2.2 任何合法的赋值表达式都可以,示例如下

var o = {};
[o.a, o.b, o.c] = foo();
( { x: o.x, y: o.y, z: o.z } = bar() );
console.log( o.a, o.b, o.c );       // 1 2 3
console.log( o.x, o.y, o.z );       // 4 5 6

2.3 甚至可以在解构中使用计算出的属性表达式

var which = "x",
o = {};
( { [which]: o[which] } = bar() );
console.log( o.x );                 // 4

这个很有用,因为有时我们的变量名是动态的,需要通过取到另一个变量的值作为所需的变量名。

2.4 等号后面可以是任何数组或者对象,而不一定是返回数组或对象的函数

var o1 = { a: 1, b: 2, c: 3 },
o2 = {};
( { a: o2.x, b: o2.y, c: o2.z } = o1 );
console.log( o2.x, o2.y, o2.z );    // 1 2 3

2.5 可以把一个对象映射为一个数组

 var o1 = { a: 1, b: 2, c: 3 },
a2 = [];
( { a: a2[0], b: a2[1], c: a2[2] } = o1 );
console.log( a2 ); // [1,2,3]

2.6 可以把一个数组映射为一个对象

var a1 = [ 1, 2, 3 ],
o2 = {};
[ o2.a, o2.b, o2.c ] = a1;
console.log( o2 );    // {a: 1, b: 2, c: 3}

2.7 不用临时变量,交换两个变量

var x = 10, y = 20;
[ y, x ] = [ x, y ];
console.log( x, y );// 20 10

3.重复赋值

对象解构形式允许多次列出同一个源属性。举例来说:

var { a: X, a: Y } = { a: 1 };
X;  // 1
Y;  // 1

4.解构无法解除双向绑定,当取到的值是引用型时,如果将取到的值改掉,原值也将被修改

var X,Y;
( { a: X, a: Y, a: [ Z ] } = { a: [ 1 ] } );
X.push( 2 );
Y[0] = 10;
console.log(X);  // [10,2]
console.log(Y);  // [10,2]
console.log(Z);  // 1

ES6的解构介绍到这儿就全部结束了,希望能够对大家有些许帮助。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值