美文网首页技术文档
ES6变量声明——let和const

ES6变量声明——let和const

作者: 林之小记 | 来源:发表于2019-10-21 11:12 被阅读0次

    ES6之前变量声明

    作者:米书林
    参考文章:《菜鸟教程》、《 ECMAScript 6 入门》(阮一峰)

    声明方式:

    var a = 123;
    

    特点:

    -var变量可以重复声明,后面声明的变量会覆盖前面的变量

    例如:

    var a = 1;
    var a = 2;
    console.log(a); // 2
    
    -无法限制变量的修改(没有常量的概念)

    例如:

    var PIE = 3.14;
    PIE =3;
    console.log(PIE);  // 3
    
    -没有块级作用域,即大括号内声明的变量大括号外也能使用
    var str = "1233";
    if(str){
     var str1 = str;
    }
    console.log(str1);  \\ 1233
    
    -var声明的变量,先使用再声明,初始化值为:undefined

    例如:

    console.log(a1);  // undefined
    var a1=1;
    console.log(a1);  // 1
    

    这是因为在JavaScript中,变量的声明会被提升。
    我们可以把JavaScript中的变量和函数定义大概分成三个过程:
    -- 创建
    -- 初始化
    -- 赋值
    再使用var定义变量的时候创建初始化被提升了

    ES6变量声明

    ES6引入了let和const来声明变量

    let

    let声明变量的方式

    let a = 123;
    

    let声明变量的特点:

    -变量不能重复声明

    例如:

    let a = 1;
    let a = 2;
    console.log(a);
    

    上面代码浏览器会抛出错误:
    Uncaught SyntaxError: Identifier 'a' has already been declared

    但需要注意的是,在for循环中变量似乎能重复声明
    例如:

    for (let i = 0; i < 10; i++) {
            let s = "a";
            console.log(s);    //这里会输出10个a
        }
    

    什么原因呢?
    其实每个循环每执行一次都有一个大括号{},{}内的代码属于一个代码块,let声明的变量属于块级作用域,所以看上去能重复声明。

    -定义的变量可以被修改

    例如:

    let c = 1;
    c++;
    console.log(c); //2
    
    -定义的变量是块级作用域的变量

    例如:

    {
      let a = 1;
    }
    console.log(a);
    

    上面代码浏览器会报错:
    VM146:4 Uncaught ReferenceError: b is not defined at <anonymous>:4:13

    - 必须先声明后使用

    例如:

    console.log(a);
    let a = 12;
    

    上面代码浏览器会报错:
    VM1232:1 Uncaught ReferenceError: Cannot access 'sssa' before initialization at <anonymous>:1:13
    这是因为let定义的变量处在一个自块顶部到初始化处理的暂时性死区中,我们可以理解为我们在使用变量的时候let定义的变量只完成了创建,没有进行初始化

    const

    const声明变量的方式:

    const s = 1;
    

    const 声明常量的特点:

    -常量不能重复声明,同let
    -常量不能被修改

    例如:

    const p  = 1;
    p=2;
    

    上面的代码浏览器会报错:
    VM875:1 Uncaught TypeError: Assignment to constant variable. at <anonymous>:1:2

    - 必须先声明后使用

    总结:
    ES6变量的声明加入的常量的声明和变量块级作用域的新特性。

    以下文字是菜鸟教程对const定义常量原理的描述

    const 如何做到变量在声明初始化之后不允许改变的?其实 const 其实保证的不是变量的值不变,而是保证变量指向的内存地址所保存的数据不允许改动。此时,你可能已经想到,简单类型和复合类型保存值的方式是不同的。是的,对于简单类型(数值 number、字符串 string 、布尔值 boolean),值就保存在变量指向的那个内存地址,因此 const 声明的简单类型变量等同于常量。而复杂类型(对象 object,数组 array,函数 function),变量指向的内存地址其实是保存了一个指向实际数据的指针,所以 const 只能保证指针是固定的,至于指针指向的数据结构变不变就无法控制了,所以使用 const 声明复杂类型对象时要慎重。

    相关文章

      网友评论

        本文标题:ES6变量声明——let和const

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