参考书《ECMAScript 6入门》http://es6.ruanyifeng.com/变量的解构和赋值本质上:只要模式匹配,左边的变量就能被赋予右边对应的值原则: 解构赋值的规则是,只要等号右边的值不是对象或数组,就先将其转为对象。由于undefined和null不能转化为对象,所以如果右边是undefined或者null,则会解构报错数组类型 :数组类型按照顺序匹配let [x,y,z] = [1,2,3]x = 1y = 2z = 3对象类型 :对象类型按照属性名匹配let {key1 : value1,key2 : value2} = {key2 : "v2",key1 : "v1"}value1 = "v1"value2 = "v2"字符串||数字||布尔类型let [a,b,c,d,e] = "admin"a = 'a'b = 'd'c = 'm'd = 'i'e = 'n'let {toLowerCase : method} = 'admin'method = String.prototype.toLowerCaselet {toFixed : method1} = 3method1 = Number.prototype.toFixed let {toString : method2} = truemethod2 = Boolean.prototype.toString默认值a.只有当右边对应的赋值严格等于undefined时,左边变量才能取默认值b.惰性求值c.默认值可以引用其他已经解构的变量的值let [x = 1,y = 2] = [] //此时x的默认值是1,y的默认值是2 []等同于 [][0] = undefined,[][1] = undefined .....let [x = 1,y = 2] = [null,null] //只有当x,y的值是undefined的时候,才能把默认值给x,y,此处null 不等于 undefined ,所以x = null, y = nulllet {x = 3} = {x : undefined} // x = 3let {x = 3} = {x : null} //x = nullfunction f(){ return "abc";}let [x = f()] = [1]//此时x = 1,而不是会输出"abc",因为右边对应x变量的值是可以正常赋值的,所以不执行x =f()语句let [x = 1, y = x] = [3] //x = 3,y = 3不完全解构 : 等号左边的模式只匹配一部分等号右边的值let [x,y] = [3] // x = 3 , y = undefinedlet {k1 : a, k2 : b} = {k2 : "123"} // a = undefined, b = "123"圆括号 允许使用 : 赋值语句的非模式部分 不允许使用 a.变量声明 b.函数参数 c.赋值语句模式嵌套解构 数组 let [x, ...rest] = [1, 2, 3, 4];//x = 1 rest = [2,3,4] let [x,[y,z]] = [1,[2,3]] // x = 1, y = 2, z = 3 对象 let obj = { obj2: { k1 : 'v1', k2: 'v2' } }; let { obj2, obj2: {k1 : x, k2 : y} } = obj; x // "v1" y // "v2" obj2 // {k1 : 'v1', k2 : 'v2'}
更多专业前端知识,请上 【猿2048】www.mk2048.com