zoukankan      html  css  js  c++  java
  • ES6、7、8常用新特性总结(超实用)

    ES6常用新特性

    1. let && const

    
    let 命令也用于变量声明,但是作用域为局部
    {
        let a = 10;
        var b = 1;        
    }
    在函数外部可以获取到b,获取不到a,因此例如for循环计数器就适合使用let。
    
    const用于声明一个常量,设定后值不会再改变
    const PI = 3.1415;
    PI // 3.1415
    PI = 3; //TypeError: Assignment to constant variable.
    

    2. 解构赋值

    
    ES6 允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构(Destructuring)。 
    例如数组:
    
    let [a, b, c] = [1, 2, 3];
    //等同于
    let a = 1;
    let b = 2;
    let c = 3;
    这真的让代码看起来更优美,有种python赋值的既视感。 
    
    对象的解构赋值:获取对象的多个属性并且使用一条语句将它们赋给多个变量。
    
    var {
      StyleSheet,
      Text,
      View
    } = React;
    
    等同于
    var StyleSheet = React.StyleSheet;
    var Text = React.Text;
    var View = React.Text;
    

    3. 箭头函数

    
    ES6中新增箭头操作符用于简化函数的写法,操作符左边为参数,右边为具体操作和返回值。
    
    var sum = (num1, num2) => { return num1 + num2; }
    //等同于
    var sum = function(num1, num2) {
        return num1 + num2;
    };
    箭头函数还修复了this的指向,使其永远指向词法作用域:
    
    var obj = {
        birth: 1990,
        getAge: function () {
            var b = this.birth; // 1990
            var fn = () => new Date().getFullYear() - this.birth; // this指向obj对象
            return fn();
        }
    };
    obj.getAge(); // 25
    

    4. ...操作符

    
    这个的引入几乎不会用到extend这个函数来。通过它可以将数组作为参数直接传入函数:
    
    var people = ['Lily', 'Lemon', 'Terry'];
    function sayHello(people1,people2,people3){
        console.log(`Hello ${people1},${people2},${people3}`);
    }
    sayHello(...people);//输出:Hello Lily,Lemon,Terry
    

    5. iterable类型

    
    为了统一集合类型,ES6标准引入了新的iterable类型,Array、Map和Set都属于iterable类型,具有iterable类型的集合可以通过新的for … of循环来遍历。
    
    var a = ['A', 'B', 'C'];
    var s = new Set(['A', 'B', 'C']);
    var m = new Map([[1, 'x'], [2, 'y'], [3, 'z']]);
    for (var x of a) { // 遍历Array
        alert(x);
    }
    for (var x of s) { // 遍历Set
        alert(x);
    }
    for (var x of m) { // 遍历Map
        alert(x[0] + '=' + x[1]);
    }
    
    Map相关操作如下, Set同理:
    
    var m = new Map(); // 空Map
    m.set('Adam', 67); // 添加新的key-value
    m.set('Bob', 59);
    m.has('Adam'); // 是否存在key 'Adam': true
    m.get('Adam'); // 67
    m.delete('Adam'); // 删除key 'Adam'
    m.get('Adam'); // undefined
    

    6.类

    
    ES6提供了更接近传统语言的写法,引入了Class(类)这个概念,作为对象的模板。通过class关键字,可以定义类,与多数传统语言类似。
    
    //定义类
    class Point {
      constructor(x, y) {
        this.x = x;
        this.y = y;
      }
    
      toString() {
        return '(' + this.x + ', ' + this.y + ')';
      }
    }
    

    7.Set

    
    var arr = [1,2,3,3,3,3,14]
    var set = new Set(arr)
    var arr = Array.from(set)
    console.log(arr) // 1,2,3,14
    

    ES7常用新特性

    1. Array.prototype.includes

    
    在一个数组或者列表中检查是否存在一个值
    let arr = ['react', 'angular', 'vue']
    
    // Correct
    if (arr.includes('react')) {
      console.log('Can use React')
    }
    还能在字符串中使用includes:
    
    let str = 'React Quickly'
    
    // Correct
    if (str.toLowerCase().includes('react')) {  // true
      console.log('Found "react"')  
    }
    除了增强了可读性语义化,实际上给开发者返回布尔值,而不是匹配的位置。
    
    includes也可以在NaN(非数字)使用。最后 ,includes第二可选参数fromIndex,这对于优化是有好处的,因为它允许从特定位置开始寻找匹配。
    更多例子:
    
    console.log([1, 2, 3].includes(2)) // === true)
    console.log([1, 2, 3].includes(4)) // === false)
    console.log([1, 2, NaN].includes(NaN)) // === true)
    console.log([1, 2, -0].includes(+0)) // === true)
    console.log([1, 2, +0].includes(-0)) // === true)
    console.log(['a', 'b', 'c'].includes('a')) // === true)
    console.log(['a', 'b', 'c'].includes('a', 1)) // === false)
    

    2.Exponentiation Operator(求幂运算)

    
    et a = 7 ** 12
    let b = 2 ** 7
    console.log(a === Math.pow(7,12)) // true
    console.log(b === Math.pow(2,7)) // true
    开发者还可以操作结果:
    
    let a = 7
    a **= 12
    let b = 2
    b **= 7
    console.log(a === Math.pow(7,12)) // true
    console.log(b === Math.pow(2,7)) // true
    

    ES8新特性

    1. Object.values/Object.entries

    
    ES5 引入了Object.keys方法,返回一个数组,成员是参数对象自身的(不含继承的)所有可遍历( enumerable )属性的键名。
    Object.values方法返回一个数组,成员是参数对象自身的(不含继承的)所有可遍历( enumerable )属性的键值。
    Object.entries方法返回一个数组,成员是参数对象自身的(不含继承的)所有可遍历( enumerable )属性的键值对数组。
    let {keys, values, entries} = Object;  
    
    let obj = { a: 1, b: 2, c: 3 };  
    
    for (let key of keys(obj)) {  
        console.log(key); // 'a', 'b', 'c'
    }  
    
    for (let value of values(obj)) {  
        console.log(value); // 1, 2, 3
    }  
    
    for (let [key, value] of entries(obj)) {  
        console.log([key, value]); // ['a', 1], ['b', 2], ['c', 3]
    } 
    

    2. String padding(字符串填充)

    3. Async/Await

    
    使用Promise
    使用Promise写异步代码,会比较麻烦:
    
    axios.get(`/q?query=${query}`)
    .then(response => response.data)
    .then(data =>
    {
    this.props.processfetchedData(data);
    })
    .catch(error => console.log(error));
    使用Async/Await
    Async/Await使得异步代码看起来像同步代码,这正是它的魔力所在:
    
    async fetchData(query) =>
    {
    try
    {
    const response = await axios.get(`/q?query=${query}`);
    const data = response.data;
    return data;
    }
    catch (error)
    {
    console.log(error)
    }
    }
     
    fetchData(query).then(data =>
    {
    this.props.processfetchedData(data)
    })
    Async/Await是写异步代码的新方式,以前的方法有回调函数和Promise。相比于Promise,它更加简洁,并且处理错误、条件语句、中间值都更加方便
    

    来源:https://segmentfault.com/a/1190000018128788

  • 相关阅读:
    常用Linux命令:ls/cd/pwd/mkdir/rm/mv/cp
    设计模式(5)---代理模式
    设计模式(4)---装饰模式
    设计模式(3)---基本原则
    设计模式(2)---策略模式
    设计模式(1)---简单工厂模式
    linux系统硬件配置查看方法
    boost.asio系列(一)——deadline_timer
    ubuntu 安装JDK
    计算图像数据集的RGB均值
  • 原文地址:https://www.cnblogs.com/qixidi/p/10390833.html
Copyright © 2011-2022 走看看