ES6

1、let:声明变量

  1.1、块级作用域 { }只在所处块级有效,var不具备此属性,可用于循环变量变成块级,循环结束消除

  1.2、没有变量提升,必须先声明,再使用。

  1.3、暂时性死区

var tmp = 123if(true){
    tmp = 'abc';       //未定义,与var的tmp无关
     let tmp;   
    }

 

    let arr = [];
    for (let i = 0; i < 2; i++) {
        arr[i] = function () {
            console.log(i);      //i在多个块级块级内,赋值给arr,每个块级变量不同
        }
    }
    arr[0]();      //函数输出自己上一级(此处为循环体内块级)作用域下的i值
    arr[1]();

 

2、const:声明常量,即值(内存地址)不能变化的量

  2.1:块级作用域;灵活展开可以思索到在块级内如果还包含块级,内部块级可以重新定义赋值const,因为只在本块级有效

    const MY_FAV = 7;
    if (MY_FAV === 7) {
        // 没问题,并且创建了一个块作用域变量 MY_FAV

        const MY_FAV = 20;
        // MY_FAV 现在为 20
        // MY_FAV = 10;   
        //同块级不能重新赋值
        console.log('my favorite number is ' + MY_FAV);

        // 这被提升到全局上下文并引发错误
        // var MY_FAV = 20;
    }

    // MY_FAV 依旧为7
    console.log('my favorite number is ' + MY_FAV);

  2.2:声明必须赋值;

  2.3:赋值后不能修改值,即内存地址不可更改,不能重新声明,但是可以修改对象的属性内容

    const arry = [100, 200];
    arry[0] = 'a';
    arry[1] = 'b';
    console.log(arry);    //输出ab,数组为对象,可以修改其内容,但是不能重新赋值,改变地址
    arry = ['a', 'b'];        //报错

 

3、解构赋值

  3.1:数组解构

        let arry = [1,2,3];
        let [a,b,c] = arry;   //a,b,c分别解构了arry内的值

  3.2:对象解构

        let goods = {id : 1, name: jacky};
        let {id, name} = goods;  //a,b,c分别解构了arry内的属性
        let {id:uid, name:uname} =goods;      //该种方法uid和uname为变量,log打印使用该名字,id和name用于属性匹配,只匹配匹配成功的值

 

4、箭头函数:简化函数定义  ()=>{ }

  一般将箭头函数赋值给变量,变量名为函数名,像匿名函数

  4.1:函数只有一句代码,且执行结果为返回值,可以省略大括号

const fn = (a,b) => a+b;

  4.2:如果只有一个参数,小括号也可以省略

const fn = v => v

  4.3:箭头函数this指的是函数定义位置作用域的this,没有自己的this 

    var obj = {
        name:20,
        say:()=>{
            console.log(this.name);   //obj为对象,对象的大括号没有块级作用域,所以obj的this指向window,所以箭头函数this也指向window,window中没有name
        }
    }
    obj.say();

  4.4:剩余参数:将一个不定数量的参数放到数组中   ...args省略号不能省略,代表一个数组

    const sum = (first, ...args) => {
        console.log(first);
        let totle = 0;
        args.forEach(value => {
            totle += value;
        })
        return totle;
    }

    console.log(sum(1, 2, 3));

    解构也可使用  ...arge,将多余的内容放在一个数组中

 

5、Array扩展方法

  5.1:扩展运算符rest参数:  ...    拆分(以逗号分割),合并,伪数组转真数组

 

  • 当用在函数定义时的形参前面时,称为rest参数,当函数调用时,用于接收不确定的参数.
  • 当与解构赋值组合使用时,称为rest参数,用于接收剩余的值,存储在数组中.
  • 当用在字符串或数组前面时称为扩展运算符,将数组或字符串进行拆解.

 

let ary = [1,2,3];
...ary;     // 拆分成1,2,3
console. log (...ary) ;   // 1 2 3

ary3 = [...ary1, ...ary2];
ary1.push(...ary2);

  let oDivs = document.getElementsByTagName ( 'div ' ) ;

 ..oDivs   //拆分成单个

  oDivs = [. ..oDivs] ;   //转换成真数组

 

  5.2:构造函数方法Array.from()转成数组

  let arr2 = Array.from(arrayLike); // [ 'a', 'b','c']

  5.3:find()方法找出第一个符合条件的数组成员,若无则返回undefined

  var target = array.find((item, index) =>  item.index === 2)

  5.4:findIndex()找出第一个符合条件的数组成员位置,没有返回  -1

  5.5:includes()数组是否包含给定值,返回布尔

 

6、String扩展方法

  6.1:模版字符串,创建字符串方式,反引号定义

  ${ } 模版字符串可以解析变量,换行,调用函数  

    let name = `jacky`;
    let p = '我的名字是' + name;    //传统
    let p = `我的名字是${name}`;   //模版字符串

  6.2:startsWith()和endsWith()

  判断参数字符串是否在原字符串头部 / 尾部,返回布尔值;

  6.3:repeat()重复字符串,填写次数,返回新字符串

 

7、数据结构Set,类似数组,但是成员唯一,没有重复值

const s1 = new Set(['a','b','a']);   //只有一个a

数据结构常用实例方法:add()、delete()、has()判断是否存在,返回布尔、clear()、forEach()等,也可使用扩展运算符

 

8、数据结构Map,类似对象,键值对,键不限于字符串。其实现了迭代接口也可以使用for...of和扩展运算符遍历

    let m = new Map();
    m.set('name','jacky');
    m.set('change',function(){
        console.log(1);
    })

常用属性方法:size、set、get、delete、has、clear

 

9、原始数据类型Symbol,独一无二的值,类似字符串,一般用来给对象创建独一无二的方法。

let s1 = Symbol();    //方法一,这样创建的多个symbol不同
let s2 = Symbol.for();  //方法二,这样创建的多个symbol相同

不能与其他数据运算,且不能用for...in遍历,可以用reflect.ownKeys获取所有键名

  9.1:给对象添加方法时,如果不确定对象是否有该方法,使用symbol可以安全的添加方法

    let game = {
        id: 1,
        up: function () {
            console.log(1);
        }
    };
    let methods = {
        up: Symbol()
    };
    game[methods.up] = function(){
        console.log(2);
    }
    console.log(game);   //最后会发现有两个up,一个直属game,一个在symbol内,防止冲突
   game[methods.up]();   //如要调用,这样调用

  9.2:symbol内置属性

  .hasInstance、.isConcatSpreadable、.unscopables、.replace、.search等

 

10、迭代器iterator   与  for...of

for...of遍历:Array、Arguments、Set、Map、String、TypedArray、NodeList

 

11、生成器generator:异步编程解决方案,就是一个特殊的函数

    function * gen(){
        console.log(11);   //并不直接执行
        yield 'jacky';    //yield是函数代码分隔符,这有两块代码
        yield 'Jackey';
    }

    let gener = gen();
    gener.next();    //内有迭代器属性,方法必须通过next调用,调用后,非yield行才执行
    gener.next();    
    //如,先1秒后输出1,2秒后再输出2
    //传统异步是回调函数套回调,一个是阅读不方便,一个维护不方便
    setTimeout(() => {
        console.log(1);
        setTimeout(() => console.log(2), 2000)  //如果还需要,还得往下继续套娃
    }, 1000)

    //生成器异步
    function one() {
        setTimeout(() => {
            console.log(1);
            iter.next();     //将next放置与timeout内,自动异步
        }, 1000);

    }

    function two() {
        setTimeout(() => {
            console.log(2);
            iter.next();
        }, 2000);
    }

    function* gen() {
        let o = yield one();   //将返回值赋值,之后对其操作,如商品打印
        yield two();
    }

    let iter = gen();
    iter.next();  //第一次next

以上的异步适用于多个场景,比如用户数据,再到订单数据,再到商品数据

 

12、Promise

 一个构造函数,用来封装异步操作并获取其成功或者失败的结果

    const p = new Promise(function (reslove, reject) {
        setTimeout(function () {
            let data = '数据';   //先网络请求,此行看为网络请求
            reslove(data); //resolve成功,状态返回p成功,并将data传于then 状态判断到此结束,不会再往下写接下来的操作,防止回调地狱
            let err = '失败';
            reject(err); //reject失败,状态返回p失败
        }, 1000)
    }).then....  //请求成功后执行。下接p2
//调用promise的then方法 let p2 = p.then(function (value) { //p2为状态,如果return非promise,则返回return值,如果不写return则返回undefined,但是总会返回状态 console.log(value); //如果成功,会调用此函数,其实这还是个reslove函数,对p.then依然可以进行判断,不让其再往下做操作,重新开辟p.then
     return promise 或者 非promise //如果非promise,并且写了返回,则返回其值,如果没写,则返回undefined,但是状态依旧为成功。如果为promise,则需要根据其状态返回成功或失败 }, function (reason) { console.error(reason);//如果失败,调用此函数 })

  catch:失败回调

  all:多个promise响应后再执行。有失败,返回第一个失败的结果

Promise.all([promise1, promise2, promise3]).then(function(values) {
  console.log(values);
});

 

 

13、Class类:ES6的Class是ES5的语法糖(为了更好的面向对象,详细的看JS高级

getter(一般对动态属性封装,如计算)、setter(因为要传递至少一个参数,一般做判断)

 

14、ES6模块化(export暴露、import引入)script type = 'module'   兼容性问题,其他浏览器需要bable转成ES5

分别暴露:在每段要暴露的代码前加export

统一暴露:export{name1, name2...};

默认暴露:export default{ }

通用引入:import * as 别名 from 暴露包;

解构赋值引入:import {name1,name2 ...} from 暴露包,若有名称相同,可用as起别名

简便形式:只针对默认暴露,import 名 from 暴露包

 

15、ES8的async与await(axios)

  15.1:async返回值是promise状态。如果async的return为一个promise对象,则返回结果根据该promise结果返回;若不为,则返回resolve;throw异常则为reject,其实可以理解成promise的语法糖

    async function fn() {
        return new Promise((resolve, reject) => {
            resolve('成功的数据');
        });
    }

    console.log(fn().then);

  15.2:await 

    1. await必须写在async函数中

    2. await右侧的表达式一般为promise对象

    3. await返回的是promise成功的值

    4. await的 promise 失败了,就会抛出异常,需要通过try...catch捕获处理

    //创建一个Promise
    const p = new Promise((resolve, reject) => {
        // resolve('成功');
        reject('失败');
    })

    async function fn() {
        try {
            let result = await p;
            console.log(result);
        }
        catch(e){
            console.log(e);
        }
    }
    fn();

 

16、对象扩展

Object.value获取所有值、Object.entries返回数组,方便创建map、Object.getOwnPropertyDescriptors返回对象属性的描述对象

ES9中新增rest对对象的支持

//对象合并
const skillOne = {
    q: '天音波'
}

const skillTwo = {
    w: '金钟罩'
}

const skillThree = {
    e: '天雷破'
}
const skillFour = {
    r: '猛龙摆尾'
}

const mangseng = {...skillOne, ...skillTwo, ...skillThree, ...skillFour};

 

17、正则扩展

  17.1:命名捕获分组

  17.2:正 / 反向断言

  17.3:dotAll

 

18、ES10

  18.1:对象扩展方法Object.fromEntries

  18.2:字符串扩展方法trimStart和trimEnd

  18.3:数组扩展方法flat和flatMap

 

19、ES11

  19.1:私有属性:# + 属性,只能在内部输出

  19.2:Promise.allSettled,返回状态始终成功,值为各个promise的值的集合 

  19.3:Promise.all   阻塞运行,一个为失败则失败

  19.4:字符串扩展matchAll(用于正则快速匹配提取)

  19.5:可选链操作符,语法糖,节省代码

  19.6:动态import

  19.7:BigInt

  19.8:绝对全局对象globalThis

 

扩展:

20、增强写法:

对象增强写法:

//ES5
const name = "zzz";
const age = 18;
const user = {
  name:name,
  age:age
}
console.log(user);

//ES6
const name = "zzz";
const age = 18;
const user = {
    name,age
}
console.log(user);

函数增强写法:

//ES5
const obj = {
  run:function(){
     console.log("奔跑");
  }
}

//ES6
const obj = {
  run(){
     console.log("奔跑");
  }
}

 

posted @ 2021-09-10 15:55  Jacky02  阅读(46)  评论(0)    收藏  举报