var let const 之间的区别

574 阅读2分钟

通常面试的时候 都会让说说 var let const 这3者的区别

今天我们来说说它的区别

以前我基本都是说都是用来声明对象的
只是const有些特殊 它声明的对象 值不能“更改”
当然 这里的"更改"指的是 string 和 number 类型 array 和 obj 除外

{
    let a = "let definde a";
    var b = "var definde b";
    const c = "const dedinde c";
}


console.log(a);  // a is not dedine
console.log(b);  // var definde b
console.log(c);  // c is not dedine

先看下上面的值输出
只有 var 定义的变量 能在外部获取到,let 和 const 出了{}作用域外, 就没办法获取到 let 和 const 只有在声明的作用域内才能读取到

很多时候,我们都会通过

    if(typeof a === 'undefined'){
         再进行逻辑处理
    }

但是 以上这种情况只能是在用 var 声明变量的情况下不会出问题 因为 var 会出现变量提升

下面通过 var let const 来声明一个变量 然后在声明的上面打印它

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

    console.log(a)
    const a = 1;
    
    分别得到的是
    undefined
    报错 :Cannot access 'a' before initialization
    报错 :Cannot access 'a' before initialization

而在let 和 const 这两种情况下
在没有声明变量之前,是无法获取变量
typeof 判断 undefined 就失去了意义

       所以 很多时候 要改变写写法规范了
       try{
            console.log(a);
        }catch(e){
            console.log("a 不存在",e)
        }
        const a = 1;
        let a = 1;

接下来就是都两者都存在的情况下

            var b = 2;
            if(b){
                b = 3;
                console.log(b); //报错 :Cannot access 'a' before initialization

                let b = 1;
                console.log(b); //1

                b = 3;
                console.log(b);//3
            }

只要在块级作用域内 声明的变量 那它所在的作用域内 不受外部声明相同变量的影响
它所在的作用域 在它声明之前都是 无法访问的
这种现象属于暂时性死区

这里 有个好玩的东西
在for 循环里, 我通过let 声明了变量 index
在循环里我 再通过 let 再次声明index

        通常情况下
        如果 在同一作用域内

        var 声明变量
        var a=1;
        var a=2;
        consloe.log(a); //2

        但是用 let 同样的声明
        consloe.log(a);//Identifier 'a' has already been declared
        它会报个错误,提示你已经声明过了

        但接下来 for循环却 打印了 3次 没出想上面的报错
        for (let index = 0; index < 3; index++) {
            let index = "index";
            console.log(index);// index index index
        }
        

这里 我们可以把 for 看成 父子 作用域 for(这里 声明的属于 父){ 这里声明的属于子 }
他们都作用于两个不同的作用域 ,所以不会报错

通过这些 有没有给到你一丝丝的眼前一亮呢