let/const

  1. let不存在变量提升(变量不允许在声明之前使用)
  2. let不允许重复声明
  3. 在全局作用域中let变量不是window属性,和它没关系
  4. typeof 未被声明的变量不是undefined而是报错(暂时性死区)
  5. let会形成块级作用域

解构赋值

按照一个数据结构,快速解析获取到其中的内容(一般是数组和对象)

  • 数组的解构赋值
let ary=[1,2,3];
let [a,b,c,d=0,e]=ary;
console.log(a, b, c, d);//1,2,3,0,undefined
  • 对象的解构赋值
let obj={name:'xxx',age:25,sex:0};
let {age:ageAA}=obj;//给解构的属性名起别名作为变量
console.log(age);//报错
console.log(ageAA);//25

...拓展、展开、剩余运算符

let ary=[1,2,3]
Math.max(...arg);//=>3
let ary1=[...arguments];//=>类数组转数组

箭头函数

x => (x,y) => x+y;
//相当于
function (x) {
    return function (x,y){
         return x * x;
    }
}
  1. 没有arguments(可以基于...arg获取实参集合)
  2. 没有自己的this,this是继承上下文中的this,箭头函数this不能被改变

``模板字符串

  • ${}大括号内可以放入任意的JavaScript表达式。

  • 模板字符串之间可以进行嵌套

  • 标签模板

    var a = 5, b = 10;
     
    function tag(strings, ...values) {
        console.log(strings[0]);    // "Hello "
        console.log(strings[1]);    // " world"
        console.log(strings[2]);    // ""
        console.log(values[0]);     // 15
        console.log(values[1]);     // 50
     
        return "Anything";
    }
     
    tag`Hello ${a + b} world ${a * b}`;
    //=>tag(['Hello ',' world', ''], 3, 2);
    

Promise(async/await)

Promise是ES6中新增加的内置类:目的是为了管理异步操作的

1.new Promise() 创建类的一个实例,每一个实例都可以管理一个异步操作

->必须传递一个回调函数进去(回调函数中管理你的异步操作),不传递会报错

->回调函数中会有两个参数

resolve:异步操作成功做的事情(代指成功后的事件队列 =>成功后要做的所有的事情都存放到成功这个事件队列中)

reject:异步操作失败做的事情(代指失败后的事件队列)

->new Promise的时候立即把回调函数执行了(Promise是同步的)

2.基于Promise.prototype.then方法(还有catch/finally两个方法)向成功队列和失败队列中依次加入需要处理的事情

3.如果是多个THEN掉用,不是像我们想象的依次把增加的方法执行

异步操作成功或者失败,先把第一个THEN中的方法执行,每当执行一个THEN会返回一个新的Promise实例,这个实例管控的是第一个THEN中方法执行的是成功还是失败

//=>建议不要使用THEN中的第二个参数(这样看起来很乱),而是建议我们使用Promise.prototype.catch来管理失败的情况
let promise1 = new Promise((resolve, reject) => {
    $.ajax({
        url: 'json/data2.json',
        success(result) {
            resolve(result);
        },
        error(msg) {
            reject('no');
        }
    });
});
promise1.then(result => {
    console.log('THEN1 OK', result);
    100();
    return 100;
}).catch(msg => {
    //=>第一个CATCH
    //1.异步请求失败会执行它
    //2.第一个THEN方法失败也会执行它
    console.log('CATCH1', msg);
}).then(result => {
    console.log('THEN2 OK', result);
}).catch(msg => {
    console.log('CATCH2', msg);
});
//结果是CATCH1 THEN2 OK
/***************************************************/
let A = function A() {
    return new Promise(resolve => {
        setTimeout(() => {
            resolve();
        }, 1000);
    });
};

let B = function B() {
    return new Promise(resolve => {
        setTimeout(() => {
            resolve();
        }, 1000);
    });
};

let promise = A();
promise.then(() => {
    console.log(1);
    return B();//=>如果方法中返回的一个具体值,而且执行中没有错误异常,会立即执行下一个THEN中的方法(不写RETURN也是返回的了具体值:undefined),但是如果返回的是一个PROMISR实例(并且管控了一个异步操作),只能等PROMISE完成,把成功后的结果当做具体的值返回,才能进入下一个函数执行
}).then(() => {
    console.log(2);
});

4.利用promise解决jquery中ajax请求回调地狱的问题

let queryA = function queryA() {
        return new Promise(resolve => {
            $.ajax({
                url: 'https://www.easy-mock.com/mock/5b0412beda8a195fb0978627/temp/list',
                success: resolve
            });
        });
    };

    let queryB = function queryB() {
        return new Promise(resolve => {
            $.ajax({
                url: 'https://www.easy-mock.com/mock/5b0412beda8a195fb0978627/temp/info',
                success: resolve
            });
        });
    };

    let queryC = function queryC() {
        return new Promise(resolve => {
            $.ajax({
                url: 'https://www.easy-mock.com/mock/5b0412beda8a195fb0978627/temp/add',
                method: 'POST',
                success: resolve
            });
        });
    };

    let promise = queryA();
    promise.then(result => {
        console.log('A', result);
        return queryB();//=>上一个THEN中函数手动返回一个新的PROMISE实例(管控了一个异步操作),下一个THEN会等上一个THEN中的异步成功后在执行
    }).then(result => {
        console.log('B', result);
        return queryC();
    }).then(result => {
        console.log('C', result);
    });

class(ES6中创建类的)

class A{
    constructor(){//构造函数 
    }
    a(){//定义在A原型上的方法
    }
}

interator(for of循环)

Map/Set

Map

创建Map实例:let map=new Map(/*[key,value],*/[[true,true],[{},{}],[[],[]],[null,null]]);

下面是Map实例的常用方法

set(key,value) 返回当前Map

get(key) 返回对应的value

has(key) 判断有没有 返回true/false

clear

delete

forEach

map.forEach((value,key)=>{
    });

keys 得到所有key的Iterator接口

values 得到所有values的Iterator接口

entries 得到所有key和value的Iterator接口

Set

创建Set实例let set=new Set(/*Array()*/[1,2,3]);

下面是Set实例的常用方法

add 参数1个 返回当前Set

delete 删除 返回true/false

has 判断有没有 返回true/false

clear 清空Set 无返回值

size 返回Set大小

forEach Set不能遍历索引

values 得到所有values的Iterator接口

entries 得到所有key和value的Iterator接口