Es6重点总结

ES6最重要最复杂的知识点: 1. 类和继承 2.promise 3. ES6模块化(在vue中讲)

与深拷贝相关的知识点

  1. Object.assgin()方法: 可以实现第一层对象的深拷贝
  2. 简单粗暴的深拷贝
JSON.parse(JSON.stringify(obj))
  1. 完整的深拷贝: 参考网上资料

常见的数组方法

下面的方法都有回调函数,回调的两个形参分别为项目值和索引
除了forEach, 其它的方法都需要return

  1. arr.forEach()
  2. arr.map()
  3. arr.filter()
  4. arr.some()
  5. arr.every()
  6. arr.reduce()

let: 声明块级作用域

  • 不存在声明提前的问题
  • 在同一个块中,不能重复声明
  • 通过let可获取正确的索引
    let arr = []
    for (let i = 0; i < 6; i++){
        arr[i] = function(){
            console.log(i)
        }
    }
    arr[3]()

const: 声明常量

  • const也是块级作用域
  • 声明的同时要赋值

箭头函数

arr.forEach(()=>{})
setInterval(()=>{},1000)

let fun = ()=>{}
let fun = x => {}
let fun = (x,y) => {}
let fun = (x,y) => 3
let fun = (x,y) => ({
        name: 1,
        age: 2
    })

箭头函数的this指向

箭头函数自身没有this,它内部的this是定义箭头函数所在环境的this

        box.onclick = function(){
            // console.log(this);
            let i  = 0
            setInterval(()=>{
                this.innerHTML = i;  //this是box
                i++
            },1000)
        }

对象字面量的简写

    let color = 'red',
        age = 18;

    let obj = {
        color,
        age,
        run(){
            console.log('run')
        }
    }

类和继承

定义父类

class Animal {
    constructor(color){
        this.type = 'animal';
        this.eye = true;
        this.color = color;
    }
    sound(){
        console.log('sound')
    }
}

var ani = new Animal('red')

定义子类

class Cat extends Animal{
    constructor(nickname,age,color){
        super(color);
        this.nickname = nickname;
        this.age = age;
    }
    eat(){
        console.log('eat')
    }
}
var cat = new Cat('小猫咪',5,'white')
cat.sound()

模板字符串

    let color = 'red';
    let str = `this is ${color}`

解构赋值

    let obj = {
            title: 'aaaa',
            price: 300,
            discount: 200
        }

    let {title,price} = obj;

展开运算符

把数组中的值打散,一个一个罗列

        let arr = [34, 56, 78];

        function total(Ch, En, Math) {
            return Ch + En + Math;
        }
        let result = total(...arr)

        let divList = document.querySelectorAll("div");

        //伪数组可以调用 forEach,不能调用其它数组的遍历方法
        divList.forEach((el)=>{
            console.log(el);
        })

        var arr = [...divList].map((el)=>{
            return el.innerHTML
        })
        console.log(arr);

默认参数

        function draw(radius=100){
            console.log(radius);
        }
        draw(30)

        // 默认(default)参数必须设置在最后
        function draw(y,x=2,z=20){
            console.log(x,y,z);
        }

        draw(1)
        draw(1,3)

剩余参数

        function total(...args){
            console.log(args);
            console.log(args instanceof Array);  //true
        }
        total(23,45)

Symbol数据类型

获取唯一的不会重复的变量,是ES6新增的基本数据类型

        // Symbol的应用场景

        //第三方的库中定义了一个对象(对用户来讲是隐蔽的)

        let obj = {
            name: '23',
            count() {
                console.log('count');
            }
        }

        // 对对象的功能进行扩展:希望用一个一定不会和对象已有属性重复的属性名

        let count = Symbol();

        obj[count] = function(){
            console.log('数量');
        }

        obj.count()  // count
        obj[count]();  //数量

Set类型的数据

是ES6中新增的集合的数据类型,用来存放数组。但是,数组的元素不允许重复

数组去重

    var arr = [1,2,3,2,5,1]
    var result = [...new Set(arr)]
    console.log(result);

Set常用的API

        1. add
        2. delete
        3. has
        4. clear

for...of语句

  • for: (1)需要明确遍历次数 (2)不能遍历对象,可以遍历对象以外的集合 array,伪数组 (3)可以使用break和continue
  • forEach: (1) 可以遍历对象以外的集合 (数组,Set, NodeList--->dom集合) (2)不能使用break和continue
  • for...in (1)遍历对象 (2)不能直接访问对象的属性值 (3)(3)可以使用break和continue
  • 新增的for...of:
    (1) 自定义的对象不能使用for...of,但大部分原生的数据集合都可以使用 (数组、字符串、Set类型、Map类型、NodeList)
    (2)可以使用break和continue
    //作用于数组
    var arr = ['a','c','d']
        for(let i of arr){
            console.log(i);
        } 
//作用于元素节点NodeList
    let divList = document.querySelectorAll("div");
        for (let el of divList){
            console.log(el);
        }

Object的API

  1. Object.assign: 合并对象
  2. Object.keys(): 返回对象所有键组成的集合
        let obj = {
            name: 'Peppa',
            age: 4,
            sex: '女'
        }
        // ["name","age","sex"]
        console.log(Object.keys(obj));

Map类型的数据

类似于对象,用来存储键值对。

对象只能使用字符串作为属性名,而Map可以使用任意类型的数据做为属性名

//第一个键是"a",值是1, 第二个键是b,值是2
        var map1 = new Map([["a",1],["b",2]]);
        console.log(map1);

Map的API

        属性: size 
        方法: set , get , has, delete ,clear

for...of 遍历

    var map1 = new Map([["a", 1], ["b", 2]]);
        
        //只遍历键
        for (let key of map1.keys()){
            console.log(key);
        }

        // 只遍历值
        for (let val of map1.values()){
            console.log(val);
        }


        // val是数组,存储了每一个的键和值
        for (let val of map1){
            console.log(val[0]);
            console.log(val[1]);
        }

        //同时返回键值对
        for (let [key,value] of map1){
            console.log(key);
            console.log(value);
        }

        // 等价于上面的写法
        for (let [key,value] of map1.entries()){
            console.log(key);
            console.log(value);
        }

Promise:

  • promise用来解决回调地狱的问题,把异步的代码用同步的方式来实现

  • Promise 是异步编程的一种解决方案,比传统的解决方案——回调函数和事件——更合理和更强大。
    它由社区最早提出和实现,ES6 将其写进了语言标准,统一了用法,原生提供了Promise对象。

  • 一个Promise的三种状态
    pending: 初始状态,既不是成功,也不是失败状态。
    fulfilled: 意味着操作成功完成。
    rejected: 意味着操作失败。

  • Promise构造函数接受一个函数作为参数,该函数的两个参数分别是resolve和reject。它们是两个函数,由 JavaScript 引擎提供,不用自己部署。
    Resolve函数的作用是,将Promise对象的状态从“未完成”变为“成功”(即从 pending 变为 resolved),在异步操作成功时调用,并将异步操作的结果,作为参数传递出去;
    Reject函数的作用是,将Promise对象的状态从“未完成”变为“失败”(即从 pending 变为 rejected),在异步操作失败时调用,并将异步操作报出的错误,作为参数传递出去。

  • Promise实例生成以后,可以用then方法分别指定resolved状态和rejected状态的回调函数。

    ```
        // 需求: ajax1执行完再执行ajax2,ajax2执行完再执行task
        function ajax1() {
            setTimeout(function () {
                console.log('ajax1');
            }, 1000)
        }
        function ajax2() {
            setTimeout(function () {
                console.log('ajax2');
            }, 2000)
        }
        function task() {
            console.log('task');
        }
    ```

用Promise实现

       var flag1 = true;
       var flag2 = false;

       function error(err) {
           console.log(err);
       }
       function ajax1() {
           return new Promise((resolve, reject) => {
               setTimeout(function () {
                   if (flag1) {
                       resolve('ajax1的结果')
                   } else {
                       reject('ajax1错误')
                   }
               }, 1000)
           })
       }

       function ajax2(data) {
           return new Promise((resolve, reject) => {
               setTimeout(function () {
                   console.log('ajax2接收ajax1的参数', data);
                   if (flag2){
                       resolve()
                   }else{
                       reject('ajax2错误')
                   }
               }, 2000)
           })
       }

       function task() {
           console.log('task');
       }

       ajax1()
           .then(ajax2)
           .then(task)
           .catch(error)

Promise.all() Promise.race()

Promise.all() 两个异步操作都成功完成后,再执行的逻辑
Promise.race() 最先得到结果的异步操作执行成功,即执行下面的逻辑
all()和race()中的参数必须是promise实例

   Promise.all([ajax1(),ajax2()])
           .then(function(data){
               console.log('两个请求都成功后的数据',data);
               task(data)
           })
           .catch(err)
   Promise.race([ajax1(), ajax2()])
           .then(function (data) {
               console.log('请求返回最快的任务的结果', data);
               task(data)
           })
           .catch(err)

async和await的用法

  • async: 定义一个异步函数,消除promise中then的链式调用 ,让代码更加清晰,优雅
  • await后面接一个会return new promise的函数并执行它
  • await只能放在async函数里
  • async函数通过try...catch处理失败时要执行的逻辑
    var flag1 = false;
        var flag2 = true;
        function ajax1() {
            return new Promise((resolve, reject) => {
                setTimeout(function () {
                    console.log('ajax1任务执行完毕');
                    if (flag1) {
                        resolve('ajax1的结果')
                    } else {
                        reject('ajax1错误')
                    }
                }, 1000)
            })
        }
        function ajax2(data) {
            return new Promise((resolve, reject) => {
                setTimeout(function () {
                    console.log('ajax2', data);
                    console.log('ajax2任务执行完毕');
                    if (flag2) {
                        resolve('ajax2的结果')
                    } else {
                        reject('ajax2错误')
                    }
                }, 2000)
            })
        }
        function task(data) {
            console.log('task任务执行完毕');
            console.log('task', data);
        }
       

        async function render() {
            try {
                let result1 = await ajax1()
                await ajax2(result1)
                task()
            }catch(err){
                console.log('catch',err);
            }
        }
        render()

Object.defineProperty()

定义对象的属性

let obj = {
    name: '西游记',
    addTime: '739754975945489'
}

//必须使用一个临时变量,来存储name属性的值
let temp = obj.name;


// 拦截器
Object.defineProperty(obj,"name",{
    //存取器
    get: function(){
        console.log('get');
        //get中一定要有return,return的结果即为name属性的新值
        return "《" + temp + "》"
    },
    set: function(newVal){
        console.log('set');
        temp = newVal;
    }
})

obj.name = "窗边的小豆豆";
console.log(obj.name);

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,527评论 5 470
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,314评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,535评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,006评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,961评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,220评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,664评论 3 392
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,351评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,481评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,397评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,443评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,123评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,713评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,801评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,010评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,494评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,075评论 2 341

推荐阅读更多精彩内容