《知识点累积》ES6

ES6 网道

2.let 和 const 命令

  • let

关键词:不存在变量提升暂时性死区TDZ、不允许重复声明

  • const

关键词:不是变量的值不得改动,而是变量指向的那个内存地址所保存的数据不得改动对象和数组是可以改变的

  • ES 声明变量的6种方法

varfunctionletconstimportclass

  • 顶层对象的属性

​ **关键词:**顶层对象,在浏览器环境指的是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:

  • 浏览器中默认有:thisself、和 globalThis都等价 window对象
  • 如果是 node 环境开发,例如 vue 网页开发,浏览器也有 global

3.变量的解构赋值

  • 数组的解构赋值

    • 只要某种数据结构具有 Iterator 接,就可以使用数组的解构赋值。如:SetGenerator(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
  • 数值和布尔值的解构赋值

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

    • 由于undefinednull无法转为对象,所以对它们进行解构赋值,都会报错;

    let {prop:x} = undefined;
    let {prop:y} = null;
    
  • 函数参数的解构赋值

    • undefined就会触发函数参数的默认值

      [1, undefined, 3].map((x = 'yes') => x);
      // [ 1, 'yes', 3 ]
      
  • 其它

    • 圆括号
    • 用途

9.数组的扩展

  • Array 本质上是一种特殊是对象,typeof arrobject

  • 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 循环

    • 不推荐使用,不仅遍历数字键,还会遍历非数字键。
    • 推荐使用,forwhileforEach,我常使用 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的值;
    • forEachfor...in、和Object.keys方法进行遍历,空位都会被跳过。推荐使用 forfor..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);
      
  • 实例方法

    1. valueOf(), toString()
    2. push(), pop()
    3. shift(), unshift()
    4. join()
    5. 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()

import()

注意这是一个方法,支持动态加载模块,返回一个 Promise 对象。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值