ES6中变量的解构赋值

目录

1、含义

2、变量的默认值

3、对象的解构赋值

4、对象的默认值

5、字符串的解构赋值

6、数值和布尔值的解构赋值

7、函数参数的解构赋值

8、圆括号问题

9、解构赋值的用途


1、含义

从数组和对象中提取值,对变量进行赋值,这被称为解构。(等号右边必须是可遍历的结构,否则会报错)

本质上属于‘模式匹配’,只要等号两边的模式相同,左边的变量就会被赋予对应的值。

let [foo, [[bar], baz]] = [1, [[2], 3]];
foo // 1
bar // 2
baz // 3

let [ , , third] = ["foo", "bar", "baz"];
third // "baz"

let [x, , y] = [1, 2, 3];
x // 1
y // 3

let [head, ...tail] = [1, 2, 3, 4];
head // 1
tail // [2, 3, 4]

let [x, y, ...z] = ['a'];
x // "a"
y // undefined
z // []

如果解构不成功,变量的值就等于undefined

另一种情况是不完全解构,即等号左边的模式,只匹配一部分的等号右边的数组。这种情况下,解构依然可以成功。

2、变量的默认值

1、ES6 内部使用严格相等运算符(===),判断一个位置是否有值。所以,只有当一个数组成员严格等于undefined,默认值才会生效。

2、如果默认值是一个表达式,那么这个表达式是惰性求值的,即只有在用到的时候,才会求值。

3、默认值可以引用解构赋值的其他变量,但该变量必须已经声明。

3、对象的解构赋值

解构不仅可以用于数组,还可以用于对象。

1、对象的解构与数组有一个重要的不同。数组的元素是按次序排列的,变量的取值由它的位置决定;而对象的属性没有次序,变量必须与属性同名,才能取到正确的值。

2、如果解构失败或变量没有对应的同名属性,变量的值等于undefined

3、象的解构赋值的内部机制,是先找到同名属性,然后再赋给对应的变量。真正被赋值的是后者,而不是前者。

例:

let { foo: baz } = { foo: 'aaa', bar: 'bbb' };
baz // "aaa"
foo // error: foo is not defined

上面代码中,foo是匹配的模式,baz才是变量。真正被赋值的是变量baz,而不是模式foo

4、如果解构模式是嵌套的对象,而且子对象所在的父属性不存在,那么将会报错。

4、对象的默认值

默认值生效的条件是,对象的属性值严格等于undefined

var {x = 3} = {x: undefined};
x // 3

var {x = 3} = {x: null};
x // null

上面代码中,属性x等于null,因为nullundefined不严格相等,所以是个有效的赋值,导致默认值3不会生效。

(1)如果要将一个已经声明的变量用于解构赋值,必须非常小心(避免将大括号放在首行)。

(2)解构赋值允许等号左边的模式之中,不放置任何变量名。

(3)由于数组本质是特殊的对象,因此可以对数组进行对象属性的解构。

5、字符串的解构赋值

const [a, b, c, d, e] = 'hello';
a // "h"
b // "e"
c // "l"
d // "l"
e // "o"

6、数值和布尔值的解构赋值

解构赋值时,如果等号右边是数值和布尔值,则会先转为对象。

解构赋值的规则是,只要等号右边的值不是对象或数组,就先将其转为对象。由于undefinednull无法转为对象,所以对它们进行解构赋值,都会报错。

7、函数参数的解构赋值

1、函数参数中如果是一个数组【x,y】,在传入参数的那一刻,数组参数就被解构成变量x,y,对于函数内部的代码来说,它们能感受到的参数就是xy

function move({x = 0, y = 0} = {}) {
  return [x, y];
}

move({x: 3, y: 8}); // [3, 8]
move({x: 3}); // [3, 0]
move({}); // [0, 0]
move(); // [0, 0]
function move({x, y} = { x: 0, y: 0 }) {
  return [x, y];
}

move({x: 3, y: 8}); // [3, 8]
move({x: 3}); // [3, undefined]
move({}); // [undefined, undefined]
move(); // [0, 0]

两者得到的结果不同,在等号前的括号里,是为变量进行默认值,在括号后是对参数指定默认值,undefined会触发函数的默认值。

8、圆括号问题

解构赋值虽然很方便,但是解析起来并不容易。对于编译器来说,一个式子到底是模式,还是表达式,没有办法从一开始就知道,必须解析到(或解析不到)等号才能知道。

由此带来的问题是,如果模式中出现圆括号怎么处理。ES6 的规则是,只要有可能导致解构的歧义,就不得使用圆括号。

但是,这条规则实际上不那么容易辨别,处理起来相当麻烦。因此,建议只要有可能,就不要在模式中放置圆括号。

不能使用圆括号的情况

(1)变量声明语句

(2)函数参数

(3)赋值语句的模式

可以使用圆括号的情况

可以使用圆括号的情况只有一种:赋值语句的非模式部分,可以使用圆括号。

9、解构赋值的用途

(1)交换变量的值

(2)从函数返回多个值

(3)函数参数的定义

(4)提取 JSON 数据

(5)函数参数的默认值

(6)遍历 Map 结构

(7)输入模块的指定方法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值