JavaScript中let、var、 const区别

本文介绍了ES6中let和const声明变量的特点,包括它们与var的区别,如无变量提升、存在暂时性死区、不允许重复声明以及具有块级作用域。let和const的引入解决了ES5中var声明变量的一些问题,增强了代码的可读性和安全性。同时,const用于声明不可变的常量,但若常量为对象,其属性仍可修改。
摘要由CSDN通过智能技术生成

在 ES5 中,声明变量只有 var 和 function 两种形式。但是var声明的变量会有一定的缺陷内层变量可能覆盖外层变量的问题以及用来计数的循环变量泄露为全局变量,下面有介绍),ES6提出了使用 letconst声明变量,弥补了 ES5中 var的缺点。

1、是否存在变量提升?

变量提升:在未定义之前可以使用变量而且不报错,是由 javascript 的预解析形成的

预解析:又称预解释,在浏览器拿到 js 代码将要执行之前,会整体的解读一遍 js 文件,把其中的 var声明的变量还有 function 提前定义

  • var 声明的变量存在变量提升,let/const声明的变量不存在变量提升,会报错。
    console.log(a); //undefined  ===>  a已声明还没赋值,默认得到undefined值
    var v = 1

    console.log(b); //报错:b is not defined  ===> 找不到b这个变量
    let l = 2
    
    console.log(c); //报错:c is not defined  ===> 找不到c这个变量
    const c = 3

2.是否存在暂时性死区?

暂时性死区(简称 TDZ):在变量声明之前,任何的地方都不能去提前使用,一旦使用就会报错,那么这之前的这些代码,对于这个变量来说就是暂时性死区。

  • var 声明的变量不存在暂时性死区, let/const 声明的变量存在暂时性死区。

3.是否允许重复声明变量?

  • var 声明的变量允许重复声明变量, let/const 声明的变量在同一作用域不允许重复声明变量。
    var a = 4;
    var a = 5;
    console.log(5) //5

    let b = 6;
    let b = 7;
    console.log(7) //Identifier 'b' has already been declared

    const c = 8;
    const c = 9;
    console.log(c) //Identifier 'c' has already been declared

4.是否存在块级作用域?

ES6 新增作用域 块级作用域 一个 { } 表示一个块级作用域

 js 中的作用域: 全局作用域 、函数作用域 、块级作用域(ES6新增)

作用域链 在局部作用域(函数作用域/块级作用域)中访问一个变量,如果这个作用域不存在这个变量,那么根据作用域链查找的原则,会一层层向上查找,知道找到最顶层作用域(全局作用于)为止,如果还找不到 就会报错 xxx is not defined。

  • var 不存在块级作用域, let/const 存在块级作用域。
        //var声明的变量没有块级作用域
        var a = 2;
        for (var a = 0; a < 10; a++) {

        }
        console.log(a); //10

        //let声明的变量存在块级作用域
        var a = 2;
        for (let a = 0; a < 10; a++) {

        }
        console.log(a); //2

5. 是否能修改声明的变量?

  • varlet可以。
  • const声明一个只读的常量。一旦声明,常量的值就不能改变。const声明的变量不得改变值,这意味着,const一旦声明变量,就必须立即初始化,不能留到以后赋值。
        var a = 1;
        a = 2;

        let b = 1;
        b = 100;

        const c = 1;
        c = 100; //Assignment to constant variable.  //const声明的是一个常量 不能够重新赋值


        var a;
        let b;
        const c; //Missing initializer in const declaration //const声明的变量必须要进行初始化
  • const 声明的变量 如果赋值为一个引用数据类型的值,那么是可以修改值里面的内容的,只要不去修改这个变量所指向的内存空间地址即可。
    
        const c = {
            n: 1
        };
        c.n = 100

        //const应用
        const PI = 3.1415926;
        const API = "http://www.baidu.com";

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值