ES6 网道
2.let 和 const 命令
- let
关键词:不存在变量提升
、暂时性死区
TDZ、不允许重复声明
- const
关键词:不是变量的值不得改动,而是变量指向的那个内存地址所保存的数据不得改动
、对象和数组是可以改变的
- ES 声明变量的6种方法
var
、function
、let
、const
、import
和 class
- 顶层对象的属性
**关键词:**顶层对象,在浏览器环境指的是window
对象,在 Node 指的是global
对象。ES5 之中,顶层对象的属性与全局变量是等价的。但如下不存在:
var a = 1;
window.a // 1
let b = 1;
window.b //undefined
- globalThis 对象(ES2020)
-
浏览器里面,顶层对象是
window
,但 Node 和 Web Worker 没有window
。 -
浏览器和 Web Worker 里面,
self
也指向顶层对象,但是 Node 没有self
。 -
Node 里面,顶层对象是
global
,但其他环境都不支持。
-
PS:
- 浏览器中默认有:
this
、self
、和globalThis
都等价window
对象 - 如果是
node
环境开发,例如vue
网页开发,浏览器也有global
3.变量的解构赋值
-
数组的解构赋值
- 只要某种数据结构具有
Iterator
接,就可以使用数组的解构赋值。如:Set
、Generator(yield)
- 默认值:
- 表达式右侧赋值是
undefined
,返回默认值。 - 表达式右侧赋值是
null
,返回null。 - 表达式左侧默认值是函数,返回右侧的赋值;
- 表达式右侧赋值是
- 只要某种数据结构具有
-
对象的解构赋值
-
赋值表达式右边的别名,左边是模式,右边是变量
-
对象的解构与数组有一个重要的不同。**
-
数组 的元素是按次序排列的,变量的取值由它的位置决定;
-
对象 的属性没有次序,变量必须与属性同名,才能取到正确的值。
-
默认值:与数组原理一致;
-
已声明的边框用于解构赋值,必须用上大括号;
-
let x; // 错误写法 {x} = {x:1}; // 正确写法 ({x} = {x:1})
-
对象的扩展:
属性名表达式
-
-
字符串的解构赋值
- 字符串也可以解构赋值,因为字符串被转成一个类似数组的对象。
const [a,b,c,d,e] = 'hello';// a: 'h'
const {length: len} = 'hello';// len: 5
-
数值和布尔值的解构赋值
-
解构赋值时,如果等号右边是数值和布尔值,则会先转为对象;
-
由于
undefined
和null
无法转为对象,所以对它们进行解构赋值,都会报错;
let {prop:x} = undefined; let {prop:y} = null;
-
-
函数参数的解构赋值
-
undefined
就会触发函数参数的默认值[1, undefined, 3].map((x = 'yes') => x); // [ 1, 'yes', 3 ]
-
-
其它
- 圆括号
- 用途
9.数组的扩展
-
Array
本质上是一种特殊是对象,typeof arr
是object
; -
JS 使用 32位整数保持数组的元素个数,所以 Array 属性
length
最大值是(2**32 - 1)= 4294967295
-
属性
length
是可写的,- 当设置小于当前成员个数,就自动减到
length
的值; - 当设置大于当前成员个数,就自动增加到
length
的值,新增的位置都是空位undefined
; - 清空数组的有效方法是
arr.length = 0;
此时arr
为[]
; length
必须是 >= 0 的正整数,否则报错;
- 当设置小于当前成员个数,就自动减到
-
in
运算符-
检查某个键名是否存在的运算符
in
,适用于对象,也适用于数组; -
但注意此方式不适用:
// 如果数组的某个位置是空位 undefined,in 运算符返回 false let arr = []; arr[100] = 'hello'; 100 in arr; // true 1 in arr; // false
-
-
for..in
循环- 不推荐使用,不仅遍历数字键,还会遍历非数字键。
- 推荐使用,
for
、while
、forEach
,我常使用for..of
-
空位/空元素
- 两个逗号之间没有任何值,如:
var arr = [1, , 3];
- 注意获取值时,返回
undefined
,如:arr[1]// undefined
; var arr = [1, , 3,];
等价var arr = [1, , 3];
最后一个逗号不算;var arr = [1, , 3];
不等var arr = [1, undefined, 3];
前者是空位,后者是赋值为undefined
的元素;- 使用
delete
命令,删除某个元素,会形成空位,但不影响length
的值; forEach
、for...in
、和Object.keys
方法进行遍历,空位都会被跳过。推荐使用for
或for..of
;
- 两个逗号之间没有任何值,如:
-
类似数组的对象
-
使用方法
slice
转为真正是数组// 字符串 Array.prototype.slice.call('abcdefg');// ['a', 'b', 'c', 'd', 'e', 'f', 'g'] // 对象 Array.prototype.slice.call({0: 'a', 1: 'b', 2: 'c', length: 3}) // html Array.prototype.slice.call(document.querySelectorAll("div")); // 函数默认对象 arguments Array.prototype.slice.call(arguments);
-
-
实例方法
valueOf(), toString()
push(), pop()
shift(), unshift()
join()
concat()
:注意对象是浅拷贝,只拷贝对象的引用;
[1,2,3].concat(4,5,6)
// 等价于 [1, 2, 3, 4, 5, 6]
[1,2,3].concat([4],[5],[6])
6. `reverse()`:会**改变**原数组;
7. `slice(start, end)`:提取部分元素,返回新数组,原数组**不变**。
8. `splice(start, count, addElement1, addElement2, ...)`:
- 删除原数组的部分元素,并可在删除的位置添加新元素。返回被删除的元素,会**改变**原数组;
- 第二个参数为 0,单纯的插入元素:
- ```js
let arr = [1, 1, 1];
arr.splice(1, 0, 2)// []
arr// [1, 2, 1, 1]
```
- 如果只提供第一个参数,等于把数组拆分为两个数组:
- ```js
let arr = [1,2,3,4];
arr.splice(2);// [3,4]
arr // [1,2]
```
9. `sort()`:会**改变**原数组。注意是按照**字典顺序**排序,不是**数值**。因为改方法会把**数值**先转为**字符串**。可以使用函数作为参数:
1. ```js
[10111, 1101, 111].sort() // [10111, 1101, 111]
```
2. ```js
[10111, 1101, 111].sort(function(a,b) {
return a - b;
})// [111, 1101, 10111]
```
10. `map()`:原数组**不变**。不会跳过 `undefined`和`null`,但会跳过**空位**。
11. `forEach()`:与 `map()`方法一直,唯一**区别**是不返回值,只用来操作数据。且无法**中断**,只能使用 `for`;
12. `filter()`:原数组**不变**。返回满足条件的,组成一个新数组。
13. `some(),every()`:返回布尔值。如果是空数组,不执行回调函数。直接 `some()`返回 `false`,`every()`返回 `true`;
14. `reduce(), reduceRight()`:依次处理数组的每个成员,最终累计为一个值。*建议总是加上第二个参数*。找出字符串最长的数组成员。
```js
let longest = ['aaa', 'bb', 'c'].reduce((pre, curr) => {
return pre.length > curr.length ? pre : curr;
});
// 'aaa'
```
15. `indexOf(), lastIndexOf()`:
1. 返回元素第一次出现的位置,没有则返回 `-1`;
2. 第二个参数:指定开始的位置;
对比 JS 和 ES6 的示例方法
**JS**
![在这里插入图片描述](https://img-blog.csdnimg.cn/054fc2b6a1f0462bb3a25a2e37b67d5b.png)
**ES6**
![在这里插入图片描述](https://img-blog.csdnimg.cn/05c9d503307049b08a2cb3b72f4063d1.png)
# 其它
## 1.ES2017 async/await
返回 Promise 对象的方法不会使用,仅在调用改方法中使用
```js
function test() {
retrun new Promise.resolve();
}
async function test2() {
let t = await test()
}
2. import 和 require
-
import
是ES6
,编译时加载。不能写在代码块中,只能在模块的顶层; -
require
是CommonJS
,运行时加载。动态加载,可写在代码块中;
3.import()
注意这是一个方法,支持动态加载模块,返回一个 Promise
对象。