解构赋值是一个听起来比较高大上的特性,但按个人理解,它就是一种语法糖。它并无赋予js更强大的能力,只是让赋值操做更加的灵活,效率。node
在es6以前,赋值操做须要=左边是一个变量,右边是一个数据或返回数据的函数等。
而解构赋值,是将=右边的结构分解(解构),而后按照格式给=左边进行赋值,主要分为数组的解构赋值和对象的解构赋值。es6
解构赋值的格式为,=左边为解构赋值的语法,=右边为初始化器,即一个对象或数组。json
数组的解构赋值是基于数组位置的,好比:数组
let [a,b] = [1,2] // 结果a等于1,b等于2
也能够经过解构改变变量的值。好比:数据结构
let a = 1, b = 2; [a,b] = [100, 200];
当=左边与右边不彻底匹配时,未能匹配到的变量会被赋值为undefined,好比:dom
let [a,b,c] = [1,2] //a为1,b为2,c为undefined
因此能够经过给一些变量指定默认值,以防止这种状况的发生。好比:函数
let [a,b,c=3] = [1,2] //a==1, b==2, c==3
注意:只有当在右边找不到对应的值或值为undefined时,才会使用默认值。学习
有时候,解构赋值中,你可能只关心一部分数据,这时能够经过占位符只给某些值赋值。好比:rest
let [a,,,b,,] = [1,2,3,4,5,6,7,8] //a==1 b==4
在解构赋值中,经过在变量前加...号,表示生成的变量为一个数组。好比:code
let [a,,...b] = [1,2,3,4,5] //a == 1, b==[3,4,5]
上面展现的状况都是能够联合使用的,好比:
let [a,b=8,,..c] = [1,2,3,4,5,6] //a==1 b==2 c=[4,5,6]
对象的解构赋值是基于属性的。好比:
let {name, age} = { name: 'icode007', age: 27 } //name == 'icode007' age==27
与数组的解构赋值同样,对象的解构赋值同样给未能解构的变量赋值undefined,同样可使用默认值。
当给已存在的变量解构赋值时,注意加()
let name, age; ({name, age} = {name: 'icode007', age: 27});
这是因为若是不加(),js会把左边当作一个代码块,会报错。 加了()后,整个变成了一个合法的表达式。
在上面的解构赋值中,变量名和对象中的属性名必须相同,只有这样,才能找到对应的要解构赋值的数据。
但若是咱们想要给数据赋一个不一样的名字呢? 也是有办法的。
let {name:myName, age: myAge} = {name: 'icode007', age: 27}
这样相应的名字和年龄就被赋值给myName和myAge了。
也能够同时使用默认值:
let {name:myName, age: myAge, jog: myJob = 'soft Engineer'} = {name: 'icode007', age: 27}
以上咱们列举的对象的解构赋值的例子都很是的简单,但在实际开发中,JSON数据多是很是复杂的,这时的解构赋值语法也可能变得复杂。好比:
let node = { type: "Identifier", name: "foo", loc: { start: { line: 1, column: 1 }, end: { line: 1, column: 4 } } }; let {loc: { start }} = node; console.log(start.line); console.log(start.column);
注意:每当有:出如今解构赋值中时,:左边的标识符表示要检查的位置,右边表示要赋值的目标,若是右边是{}或[]时,表示要赋值的变量在更深层次结构中。
上面的全部实例,如默认值,变量改名等特性均可能存在于一个解构赋值语句中。而且,数组的解构赋值与对象的解构赋值,也能够混合使用。这为咱们从复杂的数据结构中提取相应数据提供了极大的便利。
函数参数的解构功能对于实现多参的函数是很是有用的。
好比
function setCookie(name, value, options){ options = options || {}; var secure = option.secure, path = option.path, domain = option.domain ; //... } setCookie('type', 'js', { secure: true, expires: 60000 })
上面的函数是经常使用的实现多参函数的方式,name, value为必填参数,全部可选参数封装到options中,做为options的属性使用。
但上面的函数存在一个问题就是,你只看函数的定义,是没法知道到底可选参数的名称是什么的?你须要阅读函数代码,了解函数才能使用它。
使用函数参数解构则直观不少:
function setCookie(name, value, {secure, path, domain}){ //... }
使用一样的使用方式能够调用这个函数。
可是这种写法有种问题是当只传入name和value参数时,会报错。
更好的写法是使用函数的默认参数。
function setCookie(name, value, {secure, path = "/", domain} = {}){ //... }
在es6以前,交换两个变量的值,须要建立一个中间变量,相似这样
var a = 1, b = 2, temp; temp = a; a = b; b = temp;
如今只须要一行代码:[a,b] = [b,a]
在实际开发中,数据解构是很是复杂的,使用对象属性去层层调用的语法很是不直观,经过解构赋值,可让代码更加的直观与简洁。
数组的解构赋值中,有个小技巧。
let arr = [1,4,9,55,244]; let [...cloneArray] = arr; console.log(cloneArray);
这样就实现了数组的浅复制,而在之前,数组的复制都是经过concat()方法来完成。
更多es6的内容,能够关注个人专栏--学习ES6.