es6--let和const

let和const

标签(空格分开): es6

let敕令

这个敕令是用来说明变量的,然则和es5差别的是,用它来声明的变量是部分变量,存在于部分作用域(blocked scope):

    var a = 1;
    console.log(this.a);   ===>  1
    
    let a = 1;(部分变量,不会挂载在window或global下)
    console.log(this.a);   ===>  undefined

另外,在写es5的时刻经常会碰到变量提拔的状况,比方:

    if(true) {
        console.log(a);     ====>  undefined
        var a = 1;
    }
    
    if(true) {
        console.log(a);     ====>  报错
        let a = 1;
    }

即,假如运用let举行变量说明的话,一定要先说明再运用

const敕令

声明一个immutable(不可转变)的变量,而运用let说明的变量是mutable。然则须要注重的处所是运用const说明的变量是这个变量的自身只可能有一个值,是immutable的,然则并不指着个值是immutable的。这个值照样能够转变的。比方:

    cosnt obj = {}; //运用const声清楚明了一个immutable的变量
    obj = {}        //从新对这个变量赋值,那末就会报错了
    
    
    const obj = {};
    obj.name = 'XL';
    console.log(obj); //  {name: 'XL'}这个时刻是一般的

temporal dead zone

经由历程letconst声明的变量都有一个temporal dead zone(TDZ):当进入这个TDZ时,假如语句没有实行到说明这个变量时,在此之前get或许set这个变量都是会报错的.然则经由历程var说明的变量没有TDZ

经由历程var说明的变量的性命轮回

  • 当进入到var变量的作用域中时,便为这个变量分配了存储空间。同时这个变量立即被初始化,初始值为undefined.

  • 当语句实行到赋值语句时,这个变量转变其初始值。

经由历程let说明的变量的性命轮回

  • 当进入let说明变量的作用域中时,为这个变量分配了存储空间。然则这个变量并未没初始化。

  • 对一个还未初始化的变量举行get/set操纵将会引发ReferenceError

  • 当语句实行到赋值语句时,这个变量转变其初始值。

const声明的变量必需一开就要赋值,而且这个变量不能被给予新的值。

    const a;
    a = 'XL';   ====> 报错

在轮回中的表现: var VS let VS const

  • for

  • for-in

  • for-of

for轮回当中

    const arr = [];
    for(var i = 0; i < 3; i++) {
        arr.push(() => i);
    }
    arr.map(x => x());  //[3, 3, 3]

经由历程运用var说明变量时,会为这个值举行一次赋值,每次轮回时都邑从新对这个变量举行赋值。因而末了输出时,返回的是雷同的值

    const arr = [];
    for(let i = 0; i < 3; i++) {
        arr.push(() => i);
    }
    arr.map(x => x());  //[0, 1, 2]

运用let说明变量的时刻。每次轮回历程,都相当于在一个新的blocked scope内里声明一个变量,它们相互之间没有影响,因而末了返回的值也不雷同。

for-of轮回和for-in轮回

    const arr = [];
    for(var i of [0, 1, 2]) {
        arr.push(() => i);
    }
    arr.map(x => x());  //[2, 2, 2]

运用var说明变量时和for轮回一样。

    const arr = [];
    for(let i of [0, 1, 2]) {
        arr.push(() => i);
    }
    arr.map(x => x());  //[0, 1, 2]

运用let举行轮回时和for轮回一样。

运用const所到达的结果和let雷同,不过经由历程const说明的变量是immutable的。

for-in的运转历程和三者的表现和在for-of轮回历程当中类似。

parameters

假如运用let去说明一个和形参名字雷同的变量的时刻,将会报错

    function func(arg) {
        let arg;        //static error: duplicate declaration of 'arg' 
    }

然则假如运用var去说明的话,则不会报错,其到达的结果就是从新声明一个变量掩盖的掉了形式参数。

    function func(arg) {
        var arg;
    }

Coding style: const VS let VS var

  • 假如你要定义一个immutable varity原始值Forzen Objects)时,只管运用const

  • 假如要定义一个初始值可能会发生变化的变量时,只管运用let

  • 在全局环境下经由历程var来说明的变量是能够挂载到全局对象(window/global),然则你完全能够经由历程直接在window/global去定义这个变量/属性

参考:

exporing es6

    原文作者:苹果小萝卜
    原文地址: https://segmentfault.com/a/1190000006771013
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞