let、var、const三者有什么区别?(个人全面分析、面试)

主要区别:

  1、var、let声明变量;const声明常量

        var data1 = 11;
        data1 = 111;
        console.log(data1);//222

        let data2 = 22;
        data2 = 222;
        console.log(data2);//222

        const data3 = 33;
        data3 = 333;//Uncaught TypeError:分配给常量变量。
        console.log(data2);

  2、var声明变量存在变量提升,let、const不存在变量提升

        console.log(name1);//undefined
        var name1 = "小马哥";
        // 上面两句等同于下面三句
        var name2;
        console.log(name2);//undefined
        name2 = "小马哥";

        try {
            console.log(sex);
            let sex = "nan";
        } catch (error) {
            console.log(error);//ReferenceError:初始化之前无法访问“sex”
        }

        try {
            console.log(age);
            const age = 31;
        } catch (error) {
            console.log(error);//ReferenceError:初始化之前无法访问“sex”
        }

  不过,const声明的基本数据不可变,但引用类型的值是可以改变的:

  

        const data4 = { name: "小马哥" }
        data4.name = "-_-!";
        console.log(data4);//{name:"-_-!"}

        const data5 = [31]
        data5[0] = 23;
        console.log(data5);//[23]

  3、let、const、var作用域之间的区别

  //首先作用域大体分两种:全局、局部;细分三小种:全局作用域、函数作用域、块级作用域

   // 一、在全局作用域中定义,均为全局作用域

        // 一、在全局作用域中定义,均为全局作用域
        var vvable1 = "小马哥"
        let lvable1 = 31;
        const cvable1 = "nan";
        // 全局作用域
        console.log(vvable1, lvable1, cvable1);//小马哥 31 nan
        // 函数作用域
        function setMsg1() {
            console.log(vvable1, lvable1, cvable1);//小马哥 31 nan
        }
        setMsg1();
        // 块级作用域
        if (true) {
            console.log(vvable1, lvable1, cvable1);//小马哥 31 nan
        }

 // 二、在块级作用域中定义,只有var会变成上一级,其余都是块级作用域

        // 二、在块级作用域中定义,只有var会变成上一级,其余都是块级作用域
        if (true) {
            var vvable2 = "小马哥"
            let lvable2 = 31;
            const cvable2 = "nan";
            console.log(vvable2, lvable2, cvable2);//小马哥 31 nan
        }
        console.log(vvable2);//小马哥
        try {
            console.log(lvable2);
        } catch (error) {
            console.log(error);//ReferenceError:未定义lvable2
        }
        try {
            console.log(cvable2);
        } catch (error) {
            console.log(error);//ReferenceError:未定义cvable2
        }

  // 三、在函数作用域中定义,均为函数作用域

        // 三、在函数作用域中定义,均为函数作用域
        function setMsg2() {
            var vvable3 = "小马哥"
            let lvable3 = 31;
            const cvable3 = "nan";
            console.log(vvable3, lvable3, cvable3);//小马哥 31 nan
        }
        setMsg2();
        try {
            console.log(vvable3);
        } catch (error) {
            console.log(error);//ReferenceError:未定义lvable2
        }
        try {
            console.log(lvable3);
        } catch (error) {
            console.log(error);//ReferenceError:未定义lvable2
        }
        try {
            console.log(cvable3);
        } catch (error) {
            console.log(error);//ReferenceError:未定义cvable2
        }

// 可以简单理解,var能穿透块级作用域({}包括区域),但不能穿透函数作用域,let和const只能在块级作用域({}包括区域)中

总结一下:

        1、var、let声明变量;const声明常量

        2、var声明变量存在变量提升,let、const不存在变量提升

             不过,const声明的基本数据不可变,但引用类型的值是可以改变的:

        3、let、const、var作用域之间的区别

                一、在全局作用域中定义,均为全局作用域

                二、在块级作用域中定义,只有var会变成上一级,其余都是块级作用域

                三、在函数作用域中定义,均为函数作用域

最后发现有个问题,打印输出name居然输出了值,比较愚钝看了半天没能理解,也希望大佬能解惑一下。

        console.log(name);
        var name = "小马哥";

 

本文用以记录和个人分析,若有错误和误导行为,还请大家指出,多多包涵,欢迎各位大佬指导!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值