让咱们来仔细地看看ES6所带来的更清晰的变量声明与赋值语法。现今的变量声明语法十分的直接:左边是一个变量名,右边能够是一个数组:[]
的表达式或一个对象:{}
的表达式,等等。解构赋值容许咱们将右边的表达式看起来也像变量声明通常,而后在左边将值一一提取。听起来有点迷糊?让咱们一块儿看看下面的例子就好。javascript
如今假设咱们有一个value
变量,其值为[1, 2, 3, 4, 5]
。而后咱们想给数组的前三个元素分别声明一个变量。传统的作法是单独声明和赋值每个变量:java
jsvar value = [1, 2, 3, 4, 5]; var el1 = value[0]; var el2 = value[1]; var el3 = value[0];
有了这几个新变量,咱们本来的value
如今能够被表示为[el1, el2, el3, 4, 5]
,由于咱们如今并不关心后两个元素,因此也能够说被表示为[el1, el2, el3]
。那么如今,ES6容许咱们在左边使用这个表达式来达到和上一个代码块同样的效果:es6
jsvar value = [1, 2, 3, 4, 5]; var [el1, el2, el3] = value;
右边没必要必定是变量名:正则表达式
jsvar [el1, el2, el3] = [1, 2, 3, 4, 5];
左边也没必要必定是声明:数组
jsvar el1, el2, el3; [el1, el2, el3] = [1, 2, 3, 4, 5];
这使咱们经过仅仅使用两个变量名,就能够交换两个变量的值,这是从前的JavaScript不可能办到的事情:函数
js[el1, el2] = [el2, el1];
解构赋值也是可嵌套的:oop
jsvar value = [1, 2, [3, 4, 5]]; var [el1, el2, [el3, el4]] = value;
ES6中,返回一个数组的函数更像一个头等公民了:rest
jsfunction tuple() { return [1, 2]; } var [first, second] = tuple();
一样能够经过简单地在指定位置省略变量来忽略数组中的某个元素:code
jsvar value = [1, 2, 3, 4, 5]; var [el1, , el3, , el5] = value;
这使得从正则表达式里取出匹配的分组的过程十分得简洁:对象
jsvar [, firstName, lastName] = "John Doe".match(/^(w+) (w+)$/);
更进一步,默认值一样也能够被指定:
jsvar [firstName = "John", lastName = "Doe"] = [];
须要注意的是默认值只会在对undefined
值起做用,下面的例子中firstName
和lastName
都将是null
:
jsvar [firstName = "John", lastName = "Doe"] = [null, null];
rest参数(...变量名)让事情变得更有趣,它使你能够获得数组中“剩余“的元素。下面这个例子中,tail
变量将接收数组中”剩余“的元素,为[4, 5]:
jsvar value = [1, 2, 3, 4, 5]; var [el1, el2, el3, ...tail] = value;
不幸的是,ES6中rest参数的实现很是原始,rest参数以后不能再有其余参数(即只能是最后一个参数)。因此下面例子中的这些很是有用模式,在ES6中是不可能的(会报错):
jsvar value = [1, 2, 3, 4, 5]; var [...rest, lastElement] = value; var [firstElement, ...rest, lastElement] = value;
如今,你已经对数组的解构赋值有了清晰的认识,让咱们来看看对象的解构赋值。它们几乎以一样的方式工做,仅仅是从数组变成了对象:
jsvar person = {firstName: "John", lastName: "Doe"}; var {firstName, lastName} = person;
ES6容许变量名与对应的属性名不一致。下面的例子中,name
变量将会被声明为person.firstName
的值:
jsvar person = {firstName: "John", lastName: "Doe"}; var {firstName: name, lastName} = person;
深层嵌套的对象也不会有问题:
jsvar person = {name: {firstName: "John", lastName: "Doe"}}; var {name: {firstName, lastName}} = person;
你还能够嵌套些数组在里面:
jsvar person = {dateOfBirth: [1, 1, 1980]}; var {dateOfBirth: [day, month, year]} = person;
或者一些其余的:
jsvar person = [{dateOfBirth: [1, 1, 1980]}]; var [{dateOfBirth}] = person;
和数组解构赋值同样,对象解构赋值也可使用默认值:
jsvar {firstName = "John", lastName: userLastName = "Doe"} = {};
默认值一样也只会在对undefined
值起做用,下面的例子中firstName
和lastName
也都将是null
:
jsvar {firstName = "John", lastName = "Doe"} = {firstName: null, lastName: null};
ES6中,函数的参数也支持解构赋值。这对于有复杂配置参数的函数十分有用。你能够结合使用数组和对象的解构赋值。
jsfunction findUser(userId, options) { if (options.includeProfile) ... if (options.includeHistory) ... }
经过ES6,这会看上去更清晰简洁:
jsfunction findUser(userId, {includeProfile, includeHistory}) { if (includeProfile) ... if (includeHistory) ... }
ES6的解构赋值给JavaScript的语法带来了更多的现代化。它在减小了代码量的同时,增长了代码的可读性和表现力。
https://strongloop.com/strongblog/getting-started-with-javascript-es6-...