Web/05-JavaScript之ES6语法/05-ES6:变量的解构赋值.md
2020-07-13 21:07:43 +08:00

210 lines
5.8 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

## 解构赋值的概念
**解构赋值**ES6 允许我们按照一一对应的方式从数组或者对象中**提取值**再将提取出来的值赋值给变量
解构分解数据结构赋值给变量赋值
解构赋值在实际开发中可以大量减少我们的代码量并且让程序结构更清晰
## 数组的解构赋值
数组的结构赋值将数组中的值按照**位置**提取出来然后赋值给变量
### 语法
ES6 之前当我们在为一组变量赋值时一般是这样写
```javascript
var a = 1;
var b = 2;
var c = 3;
```
或者是这样写
```js
var arr = [1, 2, 3];
var a = arr[0];
var b = arr[1];
var c = arr[2];
```
现在有了 ES6 之后我们可以通过数组解构的方式进行赋值根据**位置**进行一一对应
```javascript
let [a, b, c] = [1, 2, 3];
```
二者的效果是一样的但明显后者的代码更简洁优雅
### 未匹配到的情况
数据的结构赋值是根据位置进行一一对应来赋值的可如果左边的数量大于右边的数量时也就是变量的数量大于值的数量时多余的变量要怎么处理呢
答案是如果变量在一一对应时没有找到对应的值那么**多余的变量会被赋值为 undefined**
### 解构时左边允许有默认值
在解构赋值时是允许使用默认值的举例如下
```javascript
{
//一个变量时
let [foo = true] = [];
console.log(foo); //输出结果true
}
{
//两个变量时
let [a, b] = ['生命壹号']; //a 赋值为生命壹号。b没有赋值
console.log(a + ',' + b); //输出结果:生命壹号,undefined
}
{
//两个变量时
let [a, b = 'smyhvae'] = ['生命壹号']; //a 赋值为生命壹号。b 采用默认值 smyhvae
console.log(a + ',' + b); //输出结果:生命壹号,smyhvae
}
```
### 将右边的 `undefined``null`赋值给变量
如果我们在赋值时采用的是 `undefined`或者`null`那会有什么区别呢
```javascript
{
let [a, b = 'smyhvae'] = ['生命壹号', undefined]; //b 虽然被赋值为 undefined但是 b 会采用默认值
console.log(a + ',' + b); //输出结果:生命壹号,smyhvae
}
{
let [a, b = 'smyhvae'] = ['生命壹号', null]; //b 被赋值为 null
console.log(a + ',' + b); //输出结果:生命壹号,null
}
```
上方代码分析
- undefined相当于什么都没有此时 b 采用默认值
- null相当于有值但值为 null
## 对象的解构赋值
对象的结构赋值将对象中的值按照**属性匹配的方式**提取出来然后赋值给变量
### 语法
ES6 之前我们从接口拿到 json 数据后一般这么赋值
```javascript
var name = json.name;
var age = json.age;
var sex = json.sex;
```
上面这种写法过于麻烦了
现在有了 ES6 之后我们可以使用对象解构的方式进行赋值举例如下
```js
const person = { name: 'qianguyihao', age: 28, sex: '男' };
let { name, age, sex } = person; // 对象的结构赋值
console.log(name); // 打印结果qianguyihao
console.log(age); // 打印结果28
console.log(sex); // 打印结果:男
```
上方代码可以看出对象的解构与数组的结构有一个重要的区别**数组**的元素是按次序排列的变量的取值由它的**位置**决定**对象的属性没有次序****根据键来取值**
### 未匹配到的情况
对象的结构赋值是根据属性名进行一一对应来赋值的可如果左边的数量大于右边的数量时也就是变量的数量大于值的数量时多余的变量要怎么处理呢
答案是如果变量在一一对应时没有找到对应的值那么**多余的变量会被赋值为 undefined**
### 给左边的变量自定义命名
对象的结构赋值里左边的变量名一定要跟右边的属性名保持一致么答案是不一定我们可以单独给左边的变量自定义命名
举例如下
```js
const person = { name: 'qianguyihao', age: 28 };
let { name: myName, age: myAge } = person; // 对象的结构赋值
console.log(myName); // 打印结果qianguyihao
console.log(myAge); // 打印结果28
console.log(name); // 打印报错Uncaught ReferenceError: name is not defined
console.log(age); // 打印报错Uncaught ReferenceError: age is not defined
```
上方的第 2 行代码中请牢记
- 等号左边的属性名 nameage 是对应等号右边的属性名
- 等号左边的 myNamemyAge 是左边自定义的变量名
或者我们也可以理解为将右边 name 的值赋值给左边的 myName 变量将右边 age 的值赋值给左边的 myAge 变量现在你应该一目了然了吧
### 圆括号的使用
如果变量 foo 在解构之前就已经定义了此时你再去解构就会出现问题下面是错误的代码编译会报错
```javascript
let foo = 'haha';
{ foo } = { foo: 'smyhvae' };
console.log(foo);
```
要解决报错只要在解构的语句外边加一个圆括号即可
```javascript
let foo = 'haha';
({ foo } = { foo: 'smyhvae' });
console.log(foo); //输出结果smyhvae
```
## 字符串解构
字符串也可以解构这是因为此时字符串被转换成了一个类似数组的对象举例如下
```javascript
const [a, b, c, d] = 'hello';
console.log(a);
console.log(b);
console.log(c);
console.log(typeof a); //输出结果string
```
打印结果
```
h
e
l
string
```
## 我的公众号
想学习**代码之外的技能**不妨关注我的微信公众号**千古壹号**
扫一扫你将发现另一个全新的世界而这将是一场美丽的意外
![](http://img.smyhvae.com/20200101.png)