解构赋值可将数组的元素或对象的属性赋予给另一个变量,该变量的定义语法与数组字面量或对象字面量很相似。此语法非常简洁,相比于传统的属性访问方式,更加直观清晰。
在不使用解构赋值的情况下,通常我们这样访问数组中的元素:
[js] view plaincopy
var first = someArray[0];
var second = someArray[1];
var third = someArray[2];
使用解构赋值后,代码得到了极大的简化,同时可读性也更强:
[js] view plaincopy
var [first, second, third] = someArray;
除了个别特性,解构赋值的大部分特性在SpiderMonkey(Firefox的JavaScript引擎)中都已得到支持,详见 bug 694100。
上面的例子为我们展示了解构赋值在数组中的运用,其基本语法形式为:
[js] view plaincopy
[ variable1, variable2, ..., variableN ] = array;
这只是将变量1到变量N分配到数组相应的元素中。当然,如果想在同一时间对变量进行声明,可以在赋值前增加相应的关键字:var,let或const:
[js] view plaincopy
var [ variable1, variable2, ..., variableN ] = array;
let [ variable1, variable2, ..., variableN ] = array;
const [ variable1, variable2, ..., variableN ] = array;
事实上,变量一词用的并不准确,因为解构赋值同样可以用于数组嵌套的情况(注意:左右两侧的格式应保持一致):
[js] view plaincopy
var [foo, [[bar], baz]] = [1, [[2], 3]];
console.log(foo);
// 1
console.log(bar);
// 2
console.log(baz);
// 3
此外,左侧的变量列表还可以一种包含连续逗号的形式跳过右侧对应的值:
[js] view plaincopy
var [,,third] = ["foo", "bar", "baz"];
console.log(third);
// "baz"
ES6中,提供了一种将右侧多余的值以数组的形式赋值给左侧变量的语法——“rest“模式:
[js] view plaincopy
var [head, ...tail] = [1, 2, 3, 4];
console.log(tail);
// [2, 3, 4]
无论是访问数组外还是数组中不存在的元素,都会得到相同的结果:undifined:
[js] view plaincopy
console.log([][0]);
// undefined
var [missing] = [];
console.log(missing);
// undefined
注意,数组赋值模式的解构赋值,同样也可迭代:
[js] view plaincopy
function* fibs() {
var a = 0;
var b = 1;
while (true) {
yield a;
[a, b] = [b, a + b];
}
}
var [first, second, third, fourth, fifth, sixth] = fibs();
console.log(sixth);
// 5
在对象中使用解构赋值,允许你为对象的不同属性绑定变量名。这种情况下,解构赋值的左侧部分类似一个对象字面量,对象中是一个名值对的列表,属性名称位于名值对内冒号左侧,变量名称位于名值对内冒号右侧,每一个属性都会去右侧对象中查找相应的赋值,每一个值都会赋值给它对应的变量:
[js] view plaincopy
var robotA = { name: "Bender" };
var robotB = { name: "Flexo" };
var { name: nameA } = robotA;
var { name: nameB } = robotB;
console.log(nameA);
// "Bender"
console.log(nameB);
// "Flexo"
当属性名称和变量名称相同时,可如下简写:
[js] view plaincopy
var { foo, bar } = { foo: "lorem", bar: "ipsum" };
console.log(foo);
// "lorem"
console.log(bar);
// "ipsum"
就像嵌套数组可用于解构赋值一样,嵌套对象也可用于解构赋值,并且两种语法还可以结合在一起使%E
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责,本站只提供参考并不构成任何投资及应用建议。本站是一个个人学习交流的平台,网站上部分文章为转载,并不用于任何商业目的,我们已经尽可能的对作者和来源进行了通告,但是能力有限或疏忽,造成漏登,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。