Junwen's home
  • ES6

    • ES6 Decorator
    • ES6核心特性
    • Promise&Generator
  • js原理

    • 简单实现bind、apply和call
    • 如何遍历一个dom tree
    • 实现函数currying
    • 实现一个event
    • 详解js的继承
    • 详解requestAnimationFrame
    • Canvas api详解
    • DOM事件
    • EventLoop详解
    • JavaScript的内存管理
    • JavaScript的运行机制
    • Math对象
    • new操作符都做了什么
    • create基本实现原理
    • Set、Map、WeakSet和WeakMap
    • web worker原理
    • WebGL教程(MDN)
  • jsInfoSeries

    • 简介
    • JavaScript基础知识
    • 基础知识2
    • 基础知识3
    • 基础知识4
  • 技巧

    • 5个js解构有趣用途
    • 如何使用set提高代码性能
    • cordova构建项目时的问题
    • js中轻松遍历对象属性的几种方式
  • 怎么写出更好的css
  • BFC详解
  • box-shadow详解
  • CSS小技巧
  • Grid布局详解
HTML
  • IP十问
  • http笔试
  • http协议
  • 浏览器原理
  • 浏览器缓存其实就这么一回事儿
  • 浏览器兼容性问题
  • 移动端开发兼容性适配
  • 前端性能优化
  • 前端如何进行seo优化
  • webpack

    • webpack HMR
    • webpack优化基本方法
  • leetcode题解

    • 两数之和
    • 判断整数是否为回文串
    • 无重复字符的最长子串
  • Js链表
  • JavaScript排序
  • React

    • 虚拟DOM原理理解
    • React Hook
    • 组件复用指南
  • Vue

    • Vue举一反三
面试题
读书笔记
GitHub (opens new window)

Syun0216

多读书多种树
  • ES6

    • ES6 Decorator
    • ES6核心特性
    • Promise&Generator
  • js原理

    • 简单实现bind、apply和call
    • 如何遍历一个dom tree
    • 实现函数currying
    • 实现一个event
    • 详解js的继承
    • 详解requestAnimationFrame
    • Canvas api详解
    • DOM事件
    • EventLoop详解
    • JavaScript的内存管理
    • JavaScript的运行机制
    • Math对象
    • new操作符都做了什么
    • create基本实现原理
    • Set、Map、WeakSet和WeakMap
    • web worker原理
    • WebGL教程(MDN)
  • jsInfoSeries

    • 简介
    • JavaScript基础知识
    • 基础知识2
    • 基础知识3
    • 基础知识4
  • 技巧

    • 5个js解构有趣用途
    • 如何使用set提高代码性能
    • cordova构建项目时的问题
    • js中轻松遍历对象属性的几种方式
  • 怎么写出更好的css
  • BFC详解
  • box-shadow详解
  • CSS小技巧
  • Grid布局详解
HTML
  • IP十问
  • http笔试
  • http协议
  • 浏览器原理
  • 浏览器缓存其实就这么一回事儿
  • 浏览器兼容性问题
  • 移动端开发兼容性适配
  • 前端性能优化
  • 前端如何进行seo优化
  • webpack

    • webpack HMR
    • webpack优化基本方法
  • leetcode题解

    • 两数之和
    • 判断整数是否为回文串
    • 无重复字符的最长子串
  • Js链表
  • JavaScript排序
  • React

    • 虚拟DOM原理理解
    • React Hook
    • 组件复用指南
  • Vue

    • Vue举一反三
面试题
读书笔记
GitHub (opens new window)
  • ES6

    • ES6 Decorator
    • ES6核心特性
      • Promise&Generator
    • js原理

      • 简单实现bind、apply和call
      • 如何遍历一个dom tree
      • 实现函数currying
      • 实现一个event
      • 详解js的继承
      • 详解requestAnimationFrame
      • Canvas api详解
      • DOM事件
      • EventLoop详解
      • JavaScript的内存管理
      • JavaScript的运行机制
      • Math对象
      • new操作符都做了什么
      • Object.create基本实现原理
      • Set、Map、WeakSet和WeakMap
      • web worker原理
      • WebGL教程(MDN)
    • jsInfoSeries

      • 简介
      • JavaScript基础知识
      • 基础知识2
      • 基础知识3
      • 基础知识4
    • 技巧

      • 5个js解构有趣用途
      • 如何使用set提高代码性能
      • cordova构建项目时的问题
      • js中轻松遍历对象属性的几种方式
    • JavaScript
    junwen
    2019-08-06

    ES6核心特性

    ES6核心特性

    参考ES6核心特性 (opens new window)

    # 开发配置

    使用babel编译ES6语法,如何用webpack实现模块化。

    # babel

    查询网址浏览器兼容性查询 (opens new window)

    # 如何配置babel?

    npm init
    npm i babel-core babel-preset-es-2015 babel-preset-latest -D
    //创建并配置.babelrc文件 存放在项目的根目录下
    npm i babel-cli -g
    babel-version
    
    1
    2
    3
    4
    5

    .babelrc的配置

    //.babelrc文件
    {
        "presets": ["es2015", "latest"],
        "plugins": []
    }
    
    1
    2
    3
    4
    5

    # 如何配置webpack

    npm i webpack bebel-locader -D
    创建并配置 webpack.config.js//webpack.config.js文件与package.json同级
    ·配置 package.json中的scripts
    ·运行 npm start
    
    1
    2
    3
    4
    module.exports = {
      entry: './src/index.js',
      output: {
        path: __dirname,
        filename: './build/bundle.js'
      },
      module: {
        rules: [{
          test: /\.js?$/,
          exclude: /(node_modules)/,
          loader: 'babel-loader'
        }]
      }
    }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14

    # 块级作用域

    ES6提供let和const来代替var声明变量,新的声明方式支持大括号表示的块级作用域,这样带来的好处是:

    1. 不需要立即执行的函数表达式(IIFE)
    2. 循环体中的闭包不在有问题
    3. 防止重复声明变量

    # 数组的扩展

    1. Array.from()

    可以将类数组转化为数组,比如说HTMLCollection

    1. Array.of()

    Array.of( )方法总会创建一个包含所有传入参数的数组,而不管参数的数量与类型

    let items = Array.of(1, 2);  // [1,2]
    
    1
    1. 数组实例的find()和findIndex()

    数组实例的find方法,用于找出第一个符合条件的数组成员。它的参数是一个回调函数,所有数组成员依次执行该回调函数,直到找出第一个返回值为true的成员,然后返回该成员。如果没有符合条件的成员,则返回undefined。

    [1, 4, -5, 10].find((n) => n < 0) // -5
    
    1

    数组实例的findIndex方法的用法与find方法非常类似,返回第一个符合条件的数组成员的位置,如果所有成员都不符合条件,则返回-1。

    [1, 5, 10, 15].findIndex(function(value, index, arr) {
      return value > 9;
    }) // 2
    
    1
    2
    3
    1. 数组实例的includes()
    [1, 2, 3].includes(2)   // true
    [1, 2, 3].includes(3, -1); // true
    [1, 2, 3, 5, 1].includes(1, 2); // true
    
    1
    2
    3
    1. 数组实例的 entries(),keys() 和 values()
    for (let index of ['a', 'b'].keys()) {
      console.log(index);
    }
    // 0
    // 1
    
    for (let elem of ['a', 'b'].values()) {
      console.log(elem);
    }
    // 'a'
    // 'b'
    
    for (let [index, elem] of ['a', 'b'].entries()) {
      console.log(index, elem);
    }
    // 0 "a"
    // 1 "b"
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17

    # Class 和传统构造函数有何区别

    从概念上讲,在 ES6 之前的 JS 中并没有和其他面向对象语言那样的“类”的概念。长时间里,人们把使用 new 关键字通过函数(也叫构造器)构造对象当做“类”来使用。由于 JS 不支持原生的类,而只是通过原型来模拟,各种模拟类的方式相对于传统的面向对象方式来说非常混乱,尤其是处理当子类继承父类、子类要调用父类的方法等等需求时。
    ES6提供了更接近传统语言的写法,引入了Class(类)这个概念,作为对象的模板。通过class关键字,可以定义类。但是类只是基于原型的面向对象模式的语法糖。

    # 对比在传统构造函数和 ES6 中分别如何实现类:

    //传统构造函数
    function MathHandle(x,y){
      this.x=x;
      this.y=y;
    }
    MathHandle.prototype.add =function(){
      return this.x+this.y;
    };
    var m=new MathHandle(1,2);
    console.log(m.add())
    
    //class语法
    class MathHandle {
     constructor(x,y){
      this.x=x;
      this.y=y;
    }
     add(){
       return this.x+this.y;
      }
    }
    const m=new MathHandle(1,2);
    console.log(m.add())
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23

    这两者有什么联系?其实这两者本质是一样的,只不过是语法糖写法上有区别。所谓语法糖是指计算机语言中添加的某种语法,这种语法对语言的功能没有影响,但是更方便程序员使用。比如这里class语法糖让程序更加简洁,有更高的可读性。

    # 对比在传统构造函数和 ES6 中分别如何实现继承:

    //传统构造函数继承
    function Animal() {
        this.eat = function () {
            alert('Animal eat')
        }
    }
    function Dog() {
        this.bark = function () {
            alert('Dog bark')
        }
    }
    Dog.prototype = new Animal()// 绑定原型,实现继承
    var hashiqi = new Dog()
    hashiqi.bark()//Dog bark
    hashiqi.eat()//Animal eat
    
    //ES6继承
    class Animal {
        constructor(name) {
            this.name = name
        }
        eat() {
            alert(this.name + ' eat')
        }
    }
    class Dog extends Animal {
        constructor(name) {
            super(name) // 有extend就必须要有super,它代表父类的构造函数,即Animal中的constructor
            this.name = name
        }
        say() {
            alert(this.name + ' say')
        }
    }
    const dog = new Dog('哈士奇')
    dog.say()//哈士奇 say
    dog.eat()//哈士奇 eat
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37

    Class之间可以通过extends关键字实现继承,这比ES5的通过修改原型链实现继承,要清晰和方便很多。

    # Promise的基本使用和原理

    Promise是一部编程的一种解决方案,比传统的解决方案(回调函数和事件)更合理和更强大。

    1. Promise原理

    # 几种遍历方式比较

    • for of 循环不仅支持数组、大多数伪数组对象,也支持字符串遍历,此外还支持 Map 和 Set 对象遍历。
    • for in循环可以遍历字符串、对象、数组,不能遍历Set/Map
    • forEach 循环不能遍历字符串、对象,可以遍历Set/Map

    # ES2018

    Promise.prototype.finally()

    Promise.prototype.finally()最终确定整个promises实现,允许你注册一个在一个promise被解决(被满足或被拒绝)时被调用的回调。

    一个典型的用例是在fetch()请求之后隐藏一个微调器:而不是复制最后一个.then()和.catch()中的逻辑,现在可以将它放在.finally()

    在Github上编辑此页 (opens new window)
    #ES6#JavaScript
    上次更新: 3/22/2021, 3:47:15 AM
    ES6 Decorator
    Promise&Generator

    ← ES6 Decorator Promise&Generator→

    最近更新
    01
    如何打造全链路项目生命周期的统一交付平台
    04-10
    02
    如何建立前端标准化研发流程
    04-10
    03
    如何从0到1一步步成体系地搭建CI
    04-10
    更多文章>
    Theme by Vdoing | Copyright © 2019-2021 Syun
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式