update: 解构赋值

This commit is contained in:
qianguyihao 2020-07-09 17:59:16 +08:00
parent 4eb000322f
commit 54963f4918
4 changed files with 136 additions and 75 deletions

View File

@ -67,6 +67,8 @@ console.log(a); // 打印结果2
通过上面两个例子可以看出** let 声明的变量只在局部块级作用域内起作用**
**经典面试题**
let 可以防止数据污染我们来看下面这个 **for 循环**的经典面试题
1 var 声明变量
@ -79,19 +81,22 @@ for (var i = 0; i < 10; i++) {
console.log('循环体外:' + i);
```
上方代码可以正常打印结果且最后一行的打印结果是 10说明**循环体外**定义的变量 i是在全局起作用的
上方代码可以正常打印结果且最后一行的打印结果是 10说明**循环体外**定义的变量 i**全局作用域**下的 i
2 let 声明变量
```javascript
for (let i = 0; i < 10; i++) {
console.log('循环体中:' + i); // // 每循环一次,就会在 { } 所在的块级作用域中,重新定义一个新的 i
console.log('循环体中:' + i); // // 每循环一次,就会在 { } 所在的块级作用域中,重新定义一个新的变量 i
}
console.log('循环体外:' + i);
```
上方代码的最后一行无法打印结果也就是说打印会报错因为用 let 定义的变量 i只在`{ }`这个**块级作用域**里生效
上方代码的关键在于**每次循环都会产生一个块级作用域每个块级作用域中会重新定义一个新的变量 i**
另外上方代码的最后一行无法打印结果也就是说打印会报错因为用 let 定义的变量 i只在`{ }`这个**块级作用域**里生效
**总结**我们要习惯用 let 声明减少 var 声明带来的**污染全局空间**
@ -99,7 +104,7 @@ console.log('循环体外:' + i);
### 3const定义常量
在程序开发中有些变量是希望声明后在业务层就不再发生变化此时可以用 const 来定义
在程序开发中有些变量是希望声明后在业务层就不再发生变化此时可以用 const 来定义**常量**常量就是值内存地址不能变化的量
举例
@ -107,7 +112,7 @@ console.log('循环体外:' + i);
const name = 'smyhvae'; //定义常量
```
const 声明的只在局部块级作用域内起作用而且 const 声明常量时必须赋值否则报错
const 声明的只在局部块级作用域内起作用而且 const 声明常量时必须赋值否则报错
### let const 的特点重要
@ -117,6 +122,8 @@ const name = 'smyhvae'; //定义常量
- 支持块级作用域
- 暂时性死区
相反 `var`声明的变量存在变量提升可以重复声明**没有块级作用域**
@ -232,7 +239,6 @@ i++; // 到这里i 的值已经是4了。因此当我们点击按钮时
上面这个运行结果才是我们预期的效果我们用 let 定义变量 i在循环的过程中每执行一次循环体就会诞生一个新的 i循环体执行 4 就会有四个 i
## 块级作用域
## 暂时性死区 DTC
@ -259,10 +265,12 @@ foo(); // 执行函数后控制台报错Uncaught ReferenceError: Cannot ac
- [阮一峰 | ECMAScript 6 入门](http://es6.ruanyifeng.com/)
## 我的公众号
想学习<font color=#0000ff>**代码之外的技能**</font>****id`qianguyihao`
想学习**代码之外的技能**不妨关注我的微信公众号**千古壹号**
扫一扫你将发现另一个全新的世界而这将是一场美丽的意外
![](http://img.smyhvae.com/2016040102.jpg)
![](http://img.smyhvae.com/20200101.png)

View File

@ -1,42 +1,53 @@
## 解构赋值的概念
**解构赋值**ES6 允许我们按照一一对应的方式从数组或者对象中**提取值**再将提取出来的值赋值给变量
## 变量的解构赋值
ES6允许我们通过数组或者对象的方式对一组变量进行赋值这被称为解构
解构分解数据结构赋值给变量赋值
解构赋值在实际开发中可以大量减少我们的代码量并且让程序结构更清晰
## 数组的解构赋值
数组的结构赋值将数组中的值按照**位置**提取出来然后赋值给变量
### 语法
### 数组的解构赋值
**举例**
通常情况下我们在为一组变量赋值时一般是这样写
ES6 之前当我们在为一组变量赋值时一般是这样写
```javascript
let a = 0;
let b = 1;
let c = 2;
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];
let [a, b, c] = [1, 2, 3];
```
二者的效果是一样的
**解构的默认值**
### 未匹配到的情况
数据的结构赋值是根据位置进行一一对应来赋值的可如果左边的数量大于右边的数量时也就是变量的数量大于值的数量时多余的变量要怎么处理呢
- 如果变量在一一对应时没有找到对应的值那么**多余的变量会被赋值为 undefined**
### 解构时左边允许有默认值
在解构赋值时是允许使用默认值的举例如下
```javascript
{
//一个变量时
@ -46,25 +57,21 @@ ES6允许我们通过数组或者对象的方式对一组变量进行赋
{
//两个变量时
let [a, b] = ['生命壹号'] //a 赋值为生命壹号。b没有赋值
let [a, b] = ['生命壹号']; //a 赋值为生命壹号。b没有赋值
console.log(a + ',' + b); //输出结果:生命壹号,undefined
}
{
//两个变量时
let [a, b = 'smyhvae'] = ['生命壹号'] //a 赋值为生命壹号。b 采用默认值 smyhvae
let [a, b = 'smyhvae'] = ['生命壹号']; //a 赋值为生命壹号。b 采用默认值 smyhvae
console.log(a + ',' + b); //输出结果:生命壹号,smyhvae
}
```
`undefined``null`的区别
### 将右边的 `undefined``null`赋值给变量
如果我们在赋值时采用的是 `undefined`或者`null`那会有什么区别呢
```javascript
{
let [a, b = 'smyhvae'] = ['生命壹号', undefined]; //b 虽然被赋值为 undefined但是 b 会采用默认值
@ -72,50 +79,78 @@ ES6允许我们通过数组或者对象的方式对一组变量进行赋
}
{
let [a, b = 'smyhvae'] = ['生命壹号', null]; //b 被赋值为 null
let [a, b = 'smyhvae'] = ['生命壹号', null]; //b 被赋值为 null
console.log(a + ',' + b); //输出结果:生命壹号,null
}
```
上方代码分析
- undefined相当于什么都没有此时 b 采用默认值
- undefined相当于什么都没有此时 b 采用默认值
- null相当于有值但值为 null
- null相当于有值但值为 null
### 对象的解构赋值
## 对象的解构赋值
通常情况下我们从接口拿到json数据后一般这么赋值
对象的结构赋值将对象中的值按照**属性匹配的方式**提取出来然后赋值给变量
### 语法
ES6 之前我们从接口拿到 json 数据后一般这么赋值
```javascript
var a = json.a;
var name = json.name;
var b = json.b;
var age = json.age;
bar c = json.c;
var sex = json.sex;
```
上面这样写过于麻烦了
上面这种写法过于麻烦了
现在我们同样可以针对对象进行结构赋值
现在有了 ES6 之后我们可以使用对象解构的方式进行赋值举例如下
**举例如下**
```
let { foo, bar } = { bar: '我是 bar 的值', foo: '我是 foo 的值' };
console.log(foo + ',' + bar); //输出结果:我是键 foo 的值,我是键 bar 的值
```js
const person = { name: 'qianguyihao', age: 28 };
let { name, age } = person; // 对象的结构赋值
console.log(name); // 打印结果qianguyihao
console.log(age); // 打印结果28
```
上方代码可以看出对象的解构与数组的结构有一个重要的区别**数组**的元素是按次序排列的变量的取值由它的**位置**决定**对象的属性没有次序****根据键来取值**
**圆括号的使用**
### 给左边的变量自定义命名
对象的结构赋值里左边的变量名一定要跟右边的变量名保持一致么答案是不一定我们可以单独给左边的变量自定义命名呢
举例如下
```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' };
@ -125,15 +160,13 @@ bar c = json.c;
要解决报错只要在解构的语句外边加一个圆括号即可
```javascript
let foo = 'haha';
({ foo } = { foo: 'smyhvae' });
console.log(foo); //输出结果smyhvae
let foo = 'haha';
({ foo } = { foo: 'smyhvae' });
console.log(foo); //输出结果smyhvae
```
### 字符串解构
## 字符串解构
字符串也可以解构这是因为此时字符串被转换成了一个类似数组的对象举例如下
@ -144,7 +177,7 @@ console.log(b);
console.log(c);
console.log(d);
console.log(typeof a); //输出结果string
console.log(typeof a); //输出结果string
```
输出结果
@ -167,42 +200,39 @@ ES6 中,如果我们要遍历一个数组,可以这样做:
![](http://img.smyhvae.com/20180304_2016.png)
forof 的循环可以避免我们开拓内存空间增加代码运行效率所以建议大家在以后的工作中使用forof循环
forof 的循环可以避免我们开拓内存空间增加代码运行效率所以建议大家在以后的工作中使用 forof 循环
注意上面的数组中`for of`获取的是数组里的值`for in`获取的是index索引值
注意上面的数组中`for of`获取的是数组里的值`for in`获取的是 index 索引值
### Map对象的遍历
### Map 对象的遍历
`for of`既可以遍历数组也可以遍历Map对象
`for of`既可以遍历数组也可以遍历 Map 对象
## 模板字符串
我们以前让字符串进行拼接的时候是这样做的传统写法的字符串拼接
```javascript
var name = 'smyhvae';
var age = '26';
console.log('name:'+name+',age:'+age); //传统写法
var name = 'smyhvae';
var age = '26';
console.log('name:' + name + ',age:' + age); //传统写法
```
这种写法比较繁琐而且容易出错
现在有了 ES6 语法字符串拼接可以这样写
```javascript
var name = 'smyhvae';
var age = '26';
var name = 'smyhvae';
var age = '26';
console.log('name:'+name+',age:'+age); //传统写法
console.log(`name:${name},age:${age}`); //ES6 写法
console.log('name:' + name + ',age:' + age); //传统写法
console.log(`name:${name},age:${age}`); //ES6 写法
```
**注意**上方代码中倒数第二行用的符号是单引号最后一行用的符号是反引号tab键的上方
**注意**上方代码中倒数第二行用的符号是单引号最后一行用的符号是反引号 tab 键的上方
参考链接
- [ES6的rest参数和扩展运算符](https://segmentfault.com/a/1190000010222698)
- [ES6 rest 参数和扩展运算符](https://segmentfault.com/a/1190000010222698)

View File

@ -0,0 +1,23 @@
## 参考链接
- <http://blog.lovebug.cn/details/html/page02.html>
- <https://github.com/ecomfe/spec>
- <https://juejin.im/post/5e3d0362e51d4526d87c605d>
- <https://juejin.im/post/592d4a5b0ce463006b43b6da>
- <https://juejin.im/post/5b67e49551882508603d1431>
- <https://juejin.im/post/5e1abeede51d453c913c340e>
- <https://juejin.im/post/5d5d5197518825237330552d>
- <http://alloyteam.github.io/CodeGuide/>