• ES6 开发常用新特性以及简述ES7


    一、关于变量

    ES6新增:块级作用域变量

    1、let定义块级作用域变量

    • 没有变量的提升,必须先声明后使用
    • let声明的变量,不能与前面的let,var,conset声明的变量重名
    {   
       {
          console.log(a)    // 报错  必须先声明再使用
          let a = 10;       // 只在当前大括号可以使用
          var b = "abc";    // 全局作用域变量
          console.log(a);   // 10
          // let a = 10     // 报错 Uncaught SyntaxError: Identifier 'a' has already been declared
          console.log(b);   // bac
       }
       console.log(b);      // abc  var 存在变量提升所以不会报错
       console.log(a);      // 报错 let 不存在变量提升 有作用域问题 只能在大括号中使用
    }

    2、const 定义只读变量

    • const声明变量的同时必须初始化赋值,一旦初始化完毕就不允许修改
    • const声明变量也是一个块级作用域变量
    • const声明的变量没有“变量的提升”,必须先声明后使用
    • const声明的变量不能与前面的let, var , const声明的变量重名
    {
       const CONSTANT = 100
       console.log(CONSTANT) // 100 只能在括号里使用
    }
       console.log(CONSTANT) // CONSTANT is not defined  报错  也是作用域问题

    二、关于函数

    1、ES6可以给形参函数设置默认值

    就是说,当我们调用函数时,如果设置了默认形参,即使没给函数传入实参,那么函数的实参就是默认形参。

    function fun2(a = 1, b= 2){
        console.log(a,b)  // 1,2
    }
    fun2(10,20);  // 10 20
    fun2(100);   // 100 2  没有传参  则取初始默认值

    在构造函数中也可是使用的

    function Person(name, age, sex = ""){
        this.name = name;
        this.age = age;
        this.sex = sex;
    }
    var p1 = new Person("张三", 20);
    console.log(p1)     // Person {name: "张三", age: 20, sex: "男"}
    var p2 = new Person("李", 30);
    console.log(p2)     // Person {name: "李四", age: 30, sex: "男"}
    var p3 = new Person("王五", 20, "");
    console.log(p3)     // Person {name: "王五", age: 20, sex: "女"

    2、箭头函数

    // 正常函数
    var fun3 = function(a){
        console.log(a);
    }
    // 箭头函数  区别在于 this 的指向    开发中建议都有箭头函数  能省去很多代码
    var fun3 = (a)=>{console.log(a);}
    fun3(999);

    复习一下this的认识

    1.在函数体外,this指的就是window对象
    2.在函数替内,谁调用函数this就指向谁
    3.在构造函数中,this指的是新创建的对象
    4.在html标签中,this指的是当前的这个标签元素
    5.在ES6中,对于箭头函数,它本身没有this,要看它在哪里创建的,和当前函数的作用域, 通俗说由执行上下文确定。

    三、... 扩展运算符   可以将对象或者数组里面的值展开

    1、对象用法

    const a = [1, 2, 3]
    console.log(a) // 1 2 3
    const b = {a: 1, b: 2}
    console.log({c: 3, ...b}) // {a: 1, b: 2, c: 3}

    2、在数组之前加上三个点(...)

    var arr = [1,2,3,4,5];
    console.log(arr);    // [1, 2, 3, 4, 5]
    console.log(...arr)  // 1 2 3 4 5

    3、可以根据数组的展开运算用数组给函数批量的传参 (用的比较多)

    function fun5(a,b,c,d,e,f){
        console.log(a,b,c,d,e,f)
    }
    fun5([1,2,3,4,5]) // [1, 2, 3, 4, 5] undefined undefined undefined undefined undefine

    fun5(...[11,22,33,44,55,66]) // 11 22 33 44 55 66

    四、关于apply和call

    apply和call,都是对象本身没有某个属性或者方法,去引用其他对象的属性或方法,也就是说两者都可以改变this的属性

    不同之处

    apply(this的指向,数组/arguments)
    call(this的指向,参数1,参数2,参数3)

    var name ="window的name";
    var obj = {
        name:"obj的name",
        showName:function(v1,v2,v3){
    
            console.log(v1,v2,v3)
        }
    }
    obj.showName();
    obj.showName.apply(window,[10,20,30]); // 10 20 30
    // apply括号里的是谁,调用的前面的函数里面的this就是谁
    obj.showName.call(window,10,20,30) // 10  20  30
    var color = "yellow";
    function showColor(){
        console.log(this.color)
    }
    var obj = {
        color:"red",
    }
    showColor(); // yellow
    showColor.apply(obj); // red
    showColor.call(obj); // red
    showColor.apply(this); // yellow
    showColor.call(window); // yellow

    五、关于解构赋值

    1、数组的解构赋值

      var [a,b,c] = [11,22,33]
      console.log(a,b,c)    //  11 22 33
      var [e,[f,g],k] = [1,[2,3],5]
      console.log(e,f,g,k)  //  1 2 3 5

    2、对象的解构赋值

     var{name,age}={name:"张三", age:"20"}
     console.log(name, age)  //  张三 20
    // 以前我们互换两个变量的值,需要借助第三个变量,利用解构赋值,就方便很多了 var f1 = 88; var f2 = 99; [f1,f2] = [f2 ,f1]; console.log(f1, f2) // 99 88

    3、解构json

     var jike = {"name":"tom","age":"23","sex":"男"};
     var {name,age,sex}=jike;
     console.log(name,age,sex)//tom 23 男
    
     function cal(a,b){
        var ret1 = a+b;
        var ret2 = a-b;
        var ret3 = a*b;
        var ret4 = a/b;
        return [ret1,ret2,ret3,ret4]
     }
     var [r1,r2,r3,r4] = cal(10,5);
     console.log(r1,r2,r3,r4)  // 15 5 50 2

    六、创建对象

    ES6中创建对象  class

    class className{
    // 肯定存在一个构造函数 constructor 如果不写构造函数,有一个默认的构造函数,内容为空 constructor(){} // 注意:这里不需要逗号 // 下面是函数属性 比如属性有run dark 函数和对象都可以 run(){} dark(){} }

    举个例子

    class Person{
        // 肯定存在一个构造函数 construtor
        constructor(name,age,sex,nativePlace){
            this.name=name; // 注意:这里是分号
            this.age=age;
            this.sex=sex;
            this.nativePlace=nativePlace;
        }
        // 下面是函数属性
        eat(){console.log("红烧排骨")}
        study(){console.log("英文")}
        play(){console.log("敲代码")}
    }
    
    var sunShine = new Person("fanfan","22","","黑龙江");
    console.log(sunShine) // Person {name: "fanfan", age: "22", sex: "女", nativePlace: "黑龙江"}

    七、Promise 对象是一个构造函数,用来生成Promise实例。

    const promise = new Promise(function(resolve, reject) {
      if (/* 异步操作成功 */){
        resolve(value);
      } else {
        reject(error);
      }
    });
    // 成功
    promise.then(data => {
      console.log(data );
    });
    // 错误  异常
    promise.catch(error => {
      console.log(error );
    });

    八、Set()和Map()

    set()有序列表集合(没有重复) 数组去重利器

    Set()是指有序列表集合 (set中的元素是没有重复的)
    
    set包含的方法
    add()、has()、delete()、clear()等
    
    add() 添加
    
    var s = new Set();
    s.add(1);
    s.add(window);
    s.add(true);
    s.add(1);
    console.log(s);//一共三个元素
    console.log(s.size)//数组的长度是3  
    delete(value) 删除指定元素
    
    //结合上栗
    s.delete(window);
    console.log(s)   //1  true
    console.log(s.size)   //2
    has( value )用来判断指定的值是否在set集合中
    存在返回true 不存在返回false
    
    //结合上栗
    console.log( s.has(1) )//true
    clear() 同来清空set集合的
    
    //结合上栗
    s.clear()
    console.log(s)//此时为空
    举个例子:生成10个1-20的随机数,要求不可以重复
    var arr3 = new Set();
     while(arr3.size<10){
        var yuan = parseInt(Math.random() * (20 - 1 + 1) + 1);
        arr3.add(yuan);     
     }
     console.log(arr3)

    Map() 用来存放键值对的集合

    var map = new Map();
    map.set("name","张三");
    map.set("age",20);
    console.log(map)    // Map {"name" => "张三", "age" => 20}
    get(key)根据key值取得value
    
    console.log( map.get("name"))  // 张三
    has() 判断是否存在某个键值对
    存在返回true 不存在返回fasle
    
    console.log( map.has("age") )  // true
    console.log( map.has("age1") ) // false
    clear() 清空集合
    
    map.clear();
    console.log(map);//Map {}

    九、模板字符串

    const user = {
       name: '张三',
       age: 18    
    }
    console.log(`My name is ${user.name} and age is ${user.age}`) // My name is 张三 and age is 18

    十、for of 值遍历

    var someArray = [ "a", "b", "c" ];
    for (v of someArray) {
        console.log(v); // 输出 a,b,c
    }

    十一、Proxies  Proxy可以监听对象身上发生了什么事情,并在这些事情发生后执行一些相应的操作。一下子让我们对一个对象有了很强的追踪能力,同时在数据绑定方面也很有用处

    // 定义被侦听的目标对象
    var engineer = { name: 'Joe Sixpack', salary: 50 };
    // 定义处理程序
    var interceptor = {
      set: function (receiver, property, value) {
        console.log(property, 'is changed to', value);
        receiver[property] = value;
      }
    };
    // 创建代理以进行侦听
    engineer = Proxy(engineer, interceptor);
    // 做一些改动来触发代理
    engineer.salary = 60; // 控制台输出:salary is changed to 60

    十二、 简述Es7 

    一、异步函数(async/await) 常用利器

    var fs = require('fs');
    var readFile = function (fileName){
    // 需要被await的话 就用promise包装
    return new Promise(function (resolve, reject){ fs.readFile(fileName, function(error, data){ if (error) reject(error); resolve(data); }); }); }; // await 等待的是一个promise对象 var asyncReadFile = async function (){ // 当 f1 执行完毕后 f2 才会执行 var f1 = await readFile('/etc/fstab'); var f2 = await readFile('/etc/shells'); console.log(f1.toString()); console.log(f2.toString()); }

    二 、string中加入include方法

    includes("字符"); 用于判断字符串中是否包含某个字符
    存在返回true 不存在返回false

    includes("字符",startIndex); 用于判断字符串中下标startIndex是否是某个字符
    是返回true 不是返回false

    var str = "hello";
    console.log( str.includes("e") )     // true
    console.log( str.includes("e",3) );  // false

    三、求幂运算

    console.log(3**2)  // 9

    四、Object.values/Object.entries

    Object.values和 Object.entries是在ES2017规格中,它和Object.keys类似,返回数组类型,其序号和Object.keys序号对应。
    Object.values,Object.entries和Object.keys各自项返回是数组,相对应包括key,value或者可枚举特定对象property/attribute

    五、字符填充函数padStart 和 padEnd

    console.log('0.00'.padStart(20))           // 0.00   
    console.log('10,000.00'.padStart(20))      // 10,000.00
    console.log('250,000.00'.padStart(20))     //  250,000.00

    以上只是些个人认为比较常用的欢迎指正不对不足之处,  详细的可以看看阮一峰大神的特篇  http://es6.ruanyifeng.com/

  • 相关阅读:
    2020年JVM面试题记录
    Java对象创建过程
    Java内存模型
    JavaMail读取邮件,如何过滤需要的邮件
    Java Mail 邮件 定时收件
    Java很简单的文件上传(transferTo方式)
    Java架构师之必须掌握的10个开源工具
    Java互联网安全项目架构平台设计
    Java互联网安全项目架构设计第一篇
    Apache POI 4.0.1版本 Excel导出数据案例(兼容 xls 和 xlsx)(六)
  • 原文地址:https://www.cnblogs.com/ljx20180807/p/9872238.html
Copyright © 2020-2023  润新知