美文网首页
ES6的一些新知识点

ES6的一些新知识点

作者: w_tiger | 来源:发表于2017-03-30 11:06 被阅读0次

    简介

    • ECMAScript 6.0(以下简称 ES6)是 JavaScript 语言的下一代标准,已经在2015年6月正式发布了。它的目标,是使得 JavaScript 语言可以用来编写复杂的大型应用程序,成为企业级开发语言。
    • ES6 既是一个历史名词,也是一个泛指,含义是5.1版以后的 JavaScript 的下一代标准,涵盖了ES2015、ES2016、ES2017等等,而ES2015 则是正式名称,特指该年发布的正式版本的语言标准。

    let命令

    • ES6新增了let命令,用来声明变量。它的用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效。
    • 使用let时for循环还有一个特别之处,就是循环语句部分是一个父作用域,而循环体内部是一个单独的子作用域。
    • 不存在变量提升。
    • 暂时性死去:(只要块级作用域内存在let命令,它所声明的变量就“绑定”(binding)这个区域,不再受外部的影响)在代码块内,使用let命令声明变量之前,该变量都是不可用的。这在语法上,称为“暂时性死区”。
    • ES6明确规定,如果区块中存在let和const命令,这个区块对这些命令声明的变量,从一开始就形成了封闭作用域。凡是在声明之前就使用这些变量,就会报错。
    • 不允许重复声明 :let不允许在相同作用域内,重复声明同一个变量。

    块级作用域

    • ES5 只有全局作用域和函数作用域,没有块级作用域。

    • let实际上为 JavaScript 新增了块级作用域。

    • 块级作用域的出现,实际上使得获得广泛应用的立即执行函数表达式(IIFE)不再必要了。

    • ES5 规定,函数只能在顶层作用域和函数作用域之中声明,不能在块级作用域声明。

    • ES6 引入了块级作用域,明确允许在块级作用域之中声明函数。ES6 规定,块级作用域之中,函数声明语句的行为类似于let,在块级作用域之外不可引用。

    • ES6在附录B里面规定,浏览器的实现可以不遵守上面的规定,有自己的行为方式。

      • 允许在块级作用域内声明函数。
      • 函数声明类似于var,即会提升到全局作用域或函数作用域的头部。
      • 同时,函数声明还会提升到所在的块级作用域的头部。

    do 表达式

    • 块级作用域之前加上do,使它变为do表达式,从而使得块级作用域可以变为表达式,也就是说可以返回值。

    const命令

    • const声明一个只读的常量(常量索引)。一旦声明,常量的值就不能改变。
    • 对于const来说,只声明不赋值,就会报错。
    • const的作用域与let命令相同:只在声明所在的块级作用域内有效。
    • const命令声明的常量也是不提升,同样存在暂时性死区,只能在声明的位置后面使用。
    • const声明的常量,也与let一样不可重复声明。
    • const实际上保证的,并不是变量的值不得改动,而是变量指向的那个内存地址不得改动。
    • 想将对象冻结,应该使用Object.freeze方法。

    ES6 声明变量的六种方法

    • var命令和function命令;(ES5 只有这两种声明变量的方法)
    • let和const命令;
    • import命令和class命令。

    顶层对象的属性

    • 顶层对象,在浏览器环境指的是window对象,在Node指的是global对象。ES5之中,顶层对象的属性与全局变量是等价的。
    • ES6为了改变这一点,一方面规定,为了保持兼容性,var命令和function命令声明的全局变量,依旧是顶层对象的属性;另一方面规定,let命令、const命令、class命令声明的全局变量,不属于顶层对象的属性。也就是说,从ES6开始,全局变量将逐步与顶层对象的属性脱钩。

    global 对象

    • ES5的顶层对象,本身也是一个问题,因为它在各种实现里面是不统一的:

      • 浏览器里面,顶层对象是window,但 Node 和 Web Worker 没有window。
      • 浏览器和 Web Worker 里面,self也指向顶层对象,但是Node没有self。
      • Node 里面,顶层对象是global,但其他环境都不支持。
    • 同一段代码为了能够在各种环境,都能取到顶层对象,现在一般是使用this变量,但是有局限性:
      - 全局环境中,this会返回顶层对象。但是,Node模块和ES6模块中,this返回的是当前模块。

      • 函数里面的this,如果函数不是作为对象的方法运行,而是单纯作为函数运行,this会指向顶层对象。但是,严格模式下,这时this会返回undefined。
      • 不管是严格模式,还是普通模式,new Function('return this')(),总是会返回全局对象。但是,如果浏览器用了CSP(Content Security Policy,内容安全政策),那么eval、new Function这些方法都可能无法使用。
    • 现在有一个提案,在语言标准的层面,引入global作为顶层对象。也就是说,在所有环境下,global都是存在的,都可以从它拿到顶层对象。

    箭头函数

    var f = v => v;
    等价于:var f = function(v) {
    return v;
    };

    • 箭头函数有几个使用注意点。

    (1)函数体内的this对象,就是定义时所在的对象,而不是使用时所在的对象。

    (2)不可以当作构造函数,也就是说,不可以使用new命令,否则会抛出一个错误。

    (3)不可以使用arguments对象,该对象在函数体内不存在。如果要用,可以用Rest参数代替。

    (4)不可以使用yield命令,因此箭头函数不能用作Generator函数。

    • 箭头函数里面根本没有自己的this,而是引用外层的this。
    • 箭头后面是大括号的代码块时需要在大括号外面加上小括号。

    Class

    • 类的数据类型就是函数,类本身就指向构造函数。
    • 直接对类使用new命令,跟构造函数的用法完全一致。
    • 构造函数的prototype属性,在ES6的“类”上面继续存在。事实上,类的所有方法都定义在类的prototype属性上面,在类的实例上面调用方法,其实就是调用原型上的方法。
    • 类的内部所有定义的方法,都是不可枚举的(non-enumerable)。
    • constructor方法是类的默认方法,通过new命令生成对象实例时,自动调用该方法。一个类必须有constructor方法,如果没有显式定义,一个空的constructor方法会被默认添加。

    相关文章

      网友评论

          本文标题:ES6的一些新知识点

          本文链接:https://www.haomeiwen.com/subject/rimuottx.html