ECMAScript新特性

92 阅读5分钟

ECMAScript

  • ECMAScript是JavaScript的标准化规范。
  • JavaScript是ECMAScript的扩展语言。
  • JavaScript语言本身指的就是ECMAScript.
  • 从2015年开始,ECMAScript保持每年一个版本的迭代。

ES2015

  • ES2015就是我们常说的ES6。
  • ES6既可以特指ES2015,也可以泛指ES2015及以后的所有版本。

ES6在原有基础上做了哪些改进呢?

  1. 解决了原有语法上的一些问题或者不足
  2. 对原有语法进行增强
  3. 全新的对象、全新的方法、全新的功能
  4. 全新的数据类型和数据结构

ES6新特性

let声明变量

ES6以前声明变量是通过“var”关键字。 ES6新增了通过“let”关键字声明变量。

ES6之前有两种作用域:函数作用域和全局作用域;ES6新增了块级作用域

let声明的变量,只能在其声明的块级作用域中使用,在外部无法访问到

    {
        let a = 10;
        var b = 20;
    }
    console.log(b)    // 结果: 输出20
    console.log(a)    // 结果: 报错。提示 ReferenceError: a is not defined

let声明的变量不存在变量提示,需要先声明变量才能使用

    console.log(a);         // 结果:报错。提示 ReferenceError: Cannot access 'a' before initialization
    let a = 10;
    console.log(b);         // 结果: 输出 undefined
    var b = 20;

const声明常量

const声明的是常量,一旦声明之后不能再被修改

注意:这里所说的不能被修改,指的是不能声明之后不能再指向新的内存地址,可以修改恒量中的属性成员

    const obj = {}
    obj.name = 'xx';
    console.log(obj)      // 结果: 输出 { name: 'xx' }

    obj = {age: 20}
    console.log(obj)     // 结果: 报错,提示 TypeError: Assignment to constant variable.

const在声明时必须同时进行赋值

小tip:不用var,主用const,对于一定会变化的量配合使用let

数组解构

解构是一种从数组或对象中获取指定元素的快捷方式

数组的解构是通过下标匹配获取相应的值

    const arr = [100, 200, 300];
    
    const [ a, b, c ] = arr;
    console.log(a);    // 输出 100
    console.log(b);    // 输出 200
    console.log(c);    // 输出 300
    
    // 只获取其中的某个元素
    const [, b, ] = arr;
    console.log(b);    // 输出 200  
    
    // 定义的元素个数多于数组的长度
    const [ a, b, c, d ] = arr;
    console.log(d);    // 输出 undefined
    
    // 给参数设置默认值
    const [ a='hello', b, c, d='js' ] = arr;
    console.log(a);    // 输出 100
    console,log(d);    // 输出 'js'

对象解构

对象的解构是根据属性名匹配来获取对应的属性值

可以通过 { 解构位置的成员名:新名称 } 来为解构的变量重命名

    const obj = {
        name: 'tom',
        age: 20
    }

    const { name } = obj;
    console.log(name);    // 输出 tom

    const { age: myAge } = obj
    console.log(myAge);    // 输出 20

模板字符串

模板字符串支持换行、插值表达式、JS表达式

字符串的扩展方法

  • startsWith -------- 以xx开头
  • endsWith ---------- 以xx结尾
  • includes ----------- 包含xx

参数默认值

可以为函数中的参数设置默认值。当调用函数时没有传递实参或者传递的实参值为undefined时,则使用默认值。当有多个参数时,只能将默认值放到参数列表的最后

剩余参数

  • 剩余参数是以数组的形式接收从当前位置开始的所有实参值
  • 剩余参数以"...形参名"的形式表示
  • 剩余参数用来取代以前通过arguments对象来接收无限数组的操作。在箭头函数中不能使用arguments
  • 剩余参数只能出现在形参最后一个参数的位置,而且只能使用一次
    function f(a,...args) {
        console.log(args)
    }
    f(1,2,3,4,5);    // 输出 [2,3,4,5]  

展开数组

...语法不仅可以用来收集数据,也可以用来展开数组

    const  arr = [1,2,3,4,5]
    function f(arr) {
        console.log(...arr)
    }
    f(arr);    // 输出 1,2,3,4,5 

箭头函数

箭头函数不会改变this的指向。箭头函数内的this总是与箭头函数外面的this保持一致。

    const obj = {
        name: 'tom',
        say: function () {
            console.log(`hey,my name is ${this.name}`)
        },
        say2: ()=>{
            console.log(this)    // this指向window
            console.log(`hey,my name is ${this.name}`)
        },
        sayHello: function () {
            console.log(this)    // this指向obj
            setTimeout(function () {
                console.log(this)    // this指向window
                console.log(`hey,my name is ${this.name}`)
            },1000)
        },
        sayHello2: function () {
            setTimeout(()=>{
                console.log(`hey,my name is ${this.name}`)
            },1000)
        }
    }

    obj.say();    // 输出 hey,my name is tom
    obj.say2();    // 输出 hey,my name is undefined
    obj.sayHello();    // 输出 hey,my name is undefined
    obj.sayHello2();    // 输出 hey,my name is tom

对象字面量的增强

    // 以前声明对象的属性
    var obj = {
        属性名:属性值/变量名
    }
    // 现在:当对象的属性名与变量名一致时,可以省略 “:对象名”
    var obj = {
        属性名
    }
    
    // 以前声明对象的方法
    var obj = {
        函数名: function(){...}
    }
    // 现在:可以省略 “:function”
    var obj = {
        函数名(){...}
    }
    
    // 以前为对象添加动态属性
    obj[Math.random] = 123
    现在:可以使用[动态属性名]的形式
    var obj = {
        [Math.random]: 123
    }

Object.assign

用于将多个源对象中的属性复制到一个目标对象中,对象之间有相同的属性时,源对象中的属性会覆盖目标对象中的属性

    let source1 = {
        a:123,
        b:123
    }
    let source2 = {
        c:123,
        d:'abc'
    }
    let target = {
        b: 456,
        c:789
    }
    let result = Object.assign(target,source1,source2)
    console.log(result);      // 输出 { b: 123, c: 123, a: 123, d: 'abc' }

set数据类型

set是一种新的数据类型,可以称作集合。集合里的数据不允许重复,常用于对数组进行去重

    const arr = [1,3,2,3,1,4]
    const result = new Set(arr)
    console.log(result);      // 输出 Set { 1, 3, 2, 4 }
    
   // 希望去重之后依然得到数组类型的数据
   const result = Array.from(new Set(arr))
   // 或者
   const result = [...new Set(arr)]

map数据类型

map是一种新的数据类型,与对象类型,都是键值对的集合。但是对象中的健只能是字符串类似,map中的键可以是任意类型

    const obj = {};
    let o1 = {name: 'tom'}


    obj[o1] = 50
    console.log(obj);     // 输出 { '[object Object]': 50 }


    const m = new Map()
    m.set(o1, 20)
    console.log(m);      // 输出 Map { { name: 'tom' } => 20 }

symbol数据类型

全新的原始数据类型;最主要的作用是为对象添加独一无二的属性名。但是要symbol类型的属性名只能通过 [Object.getOwnPropertySymbols(对象名)] 获取