ES6 let & const

本文深入探讨了ES6中let与var的区别,包括变量提升、重复赋值、全局变量特性、块级作用域及暂时性死区的概念。同时,详细解析了const声明只读常量的规则与特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ES6 let & const

  • let与var的区别
varlet
存在变量提升不存在变量提升
可以重复赋值不可以重复赋值
全局变量会作为window的属性全局变量不会作为window的属性
作用域:全局,局部(函数内)作用域:全局,块级作用域({}一个大括号为一个代码块)
  • 1.let不存在变量提升

    //1.没有变量声明提升
    console.log(num)//undefined
    var num=10;
    console.log(a);//报错 为:初始化前无法访问a
    let a=20;

变量声明提升

从上面的代码中可以看出,var 即使定义在输出的后面的,也不会报错,只会返回undefined,这里大致说一下var变量的声明提升
在预编译阶段,编译器会把所有var定义的变量全部提升到当前作用域的最顶部,但上去的只是定义,赋值还是在下方,所以会出现undefined。
而let没有变量提升,所以会直接报错
报错内容:Cannot access ‘a’ before initialization
翻译为:初始化前无法访问“a”

  • 2.let在相同作用域中不可以重复赋值

//2.不能重复赋值
    var sum=100;
    var sum=200;
    console.log(sum)//200
    let sum1=100;
    let sum1=200;
    console.log(sum1)//报错

var
let

从上面的代码中可以看出,var支持重新赋值,上面的值会被下面的值所覆盖
而let如果从新赋值的话就会报错
报错内容为:Identifier ‘sum1’ has already been declared
翻译为:已声明标识符“sum1”
所以 let在同一作用域中是不能重新赋值的

  • 3.let的全局变量不会作为window的属性

//3.全局变量不作为window的属性,不存放在window下
    var w=10;
    console.log(window.w);//10
    let w1=10;
    console.log(window.w1)//undefined

let不作为window的属性

从上面的代码中可以看出,let的全局变量是不会作为window的属性的。

  • 4.let 的块级作用域

 //4.块级作用域
        function num() {
            var n = 10;
            if (true) {
                var n = 5
            }
            console.log(n)
        }
        num()
        function num1() {
            let n = 10;
            if (true) {
                let n = 5
            }
            console.log(n)
        }
        num1()

作用域

从上面的代码中可以看出,var 存在变量提升。所以,外层的代码块会收到内层代码块的影响。输出5
而let 的每层{}都是一个代码块,都是不同的块作用域,所以,外层的代码块不会收到内层代码块的影响。输出10
内层的作用域可以定义外层作用域的同名变量

  • 5.let 的暂时性死区

  //5.暂时性死区
        var a=10;
        function num(){
            console.log(a);//报错
            let a;
        }
        num();

暂时性死区

只要块级作用域中存在let命令,let所声明的变量就绑定这个作用域,不在受外部的影响
ES6中明文规定,如果区块中存在let或const命令,这些区块对这些命令声明的变量,从一开始就形成了封闭作用域。凡是在声明之前就使用这些变量,就会报错。这在语法上,称为“暂时性死区”(temporal dead zone,简称 TDZ)

  • const

ES6中const用来声明一个只读的常量,用const声明的变量是不能在进行赋值的。这就意味着,const一旦声明常量,就必须立即初始化,不能留到以后赋值。

//const
       const a=5;
             a=10;//报错

const

但const只是不允许=的赋值,但我们可以用对象来进行赋值操作
因为const它锁定的只是对象在栈上的地址,但我们可以去堆中把值改变。

//const
       const p={}
       p.name='xiaoming'
       p.name='xiaohua'
       console.log(p.name)

const

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值