解构是ES6提供的一种新提取数据的模式,它允许我们从数组或对象中有针对性拿到想要的数据。这种方式让数据访问和赋值变得更加简洁和直观。
数组解构允许直接从数组中提取值,并将这些值赋给声明的变量。这避免了使用索引来访问数组元素的需要。
- const [a, b, c] = [1, 2, 3];
- console.log(a); // 输出: 1
- console.log(b); // 输出: 2
- console.log(c); // 输出: 3
不想提取数组中的所有元素,可以在解构时忽略某些元素。
- const [, I, ] = [1, 2, 3]; // 变量名被省略了
- console.log(I); // 输出: 2
解构时还可以为变量指定默认值,如果解构的元素不存在或其值为undefined
,则会使用默认值。
- const [x, y = 2] = [1];
- console.log(x); // 输出: 1
- console.log(y); // 输出: 2
- const [one,...two]=[1,2,3,4,5];
- console.log(one); // 输出: 1
- console.log(two); // 输出: [2,3,4,5]
- </script>
注意:如果将扩展运算符用于数组赋值,只能放在参数的最后一位,否则会报错。(代码编辑器里也会标红)
- const [...m,n]=[1,2,3,4,5]; // 报错SyntaxError: Rest element must be last element
- const [Y,...X,Z]=[1,2,3,4,5]; // 报错
对象解构比数组解构稍微复杂一些,与数组解构不同,对象解构时需要指定要提取的属性名。
- const person = { name: 'Alice', age: 30 };
- const { name, age } = person;
- console.log(name); // 输出: Alice
- console.log(age); // 输出: 30
在解构时,我们还可以为提取的属性指定一个新的变量名。在例子中,使用了firstName: name
的语法来将firstName
属性的值赋给变量name。
- const person = { firstName: 'Alice', age: 30 };
- const { firstName: name, age } = person;
- console.log(name); // 输出: Alice
- console.log(age); // 输出: 30
与数组解构类似,对象解构时也可以为变量指定默认值。在例子中,由于person
对象中没有age
属性,所以age
变量被赋予了默认值25
。
- const person = { name: 'Alice' };
- const { name, age = 25 } = person;
- console.log(name); // 输出: Alice
- console.log(age); // 输出: 25
对于深度嵌套的对象,读取指定属性方法如下:
1)利用老方法读取,逐层解构
- const action = {
- address:{
- man:{
- sex: '男',
- age: 20,
- }
- }
- }
- const {address} = action;
- const {man} = address;
- const {sex} = man;
- console.log(sex); // 男
2)简便方法,通过冒号加目标属性名的形式{属性名:{属性名:{属性名}} ,进行解构,直到拿到目标想要数据。
- const action = {
- address:{
- man:{
- sex: '男',
- age: 20,
- }
- }
- }
- const {address:{man:{ages}}}=action;
- console.log(ages); // 20