var,let,const的区别

发布于:2025-07-01 ⋅ 阅读:(15) ⋅ 点赞:(0)

var 的核心特性

作用域:函数作用域 或 全局作用域

变量提升:声明被提升,初始化为undefined

重复声明:允许

可变性:可以重新赋值

var 的痛点

1.变量的提升

  • 在声明前访问,不报错,值为undefined
  • 违反编码直觉,易导致bug

2.缺乏块级作用域

  • if 块内的变量会”泄露“到外部
  • for循环中的变量会”泄露“到外部
function varExample() {
    console.log(a); // 提升,值为undefined
    
    var a = 10;
    console.log(a); // 赋值后,值为10
    
    if (true) {
        var a = 20; // 覆盖了外层的a
        console.log(a); // 输出为 20
    }
    console.log(a); // 值被if块修改,输出20
}

ES6的解决方案

let&const

let:新一代声明变量

  • 作用域:块级作用域({…})

  • 暂时性死区(TDZ):声明前无法访问

  • 重复声明:同一作用域内不允许

  • 可变性:可以重新赋值

function letExample() {
    // console.log(b); // ReferenceError:TDZ
    
    let b = 10;
    console.log(b); // 输出 10
    
    if (true) {
        let b = 20; // 这是if块内的新变量
        console.log(b); // 输出 20
    }
    console.log(b); // 不受if影响,输出10
}

const:声明即永恒

  • 作用域:块级作用域({…})
  • 暂时性死区(TDZ):声明前无法访问
  • 可变性:不能重新赋值
  • 核心:保证变量引用的不变性

基本用法

function constExample() {
    const c = 30;
    // c = 40; // TypeError!
}

const与引用类型

允许修改内部,不允许修改指针指向

const obj = {name: 'React'};
// fragment
// 修改对象内部的属性? -> 允许!
obj.name = 'Vue';
console.log(boj.name); // 'Vue'

// fragment
// 将 obj 指向一个新对象? -> 不允许!
obj = {}// TypeError!

关键概念

关键点1:暂时性死区(TDZ)

  • 适用于let和const
  • 区域:从作用域{开始,到声明let/const…结束}
  • 行为:在此区域内访问变量,抛出ReferenceError

关键点2:全局对象

  • var:在全局作用域声明,会成为window的属性
var globalVar = "I'm everywhere";
console.log(window.globalVar); // "I'm everywhere"
  • let/const:不会成为widow的属性
let globalLet = "Scoped";
console.log(window.globalLet); // undefined

关键点3:开发最佳实践

1.优先使用const

  • 增强代码可预测性,避免意外修改

2.当变量需要重新赋值时,使用let

  • 例如:循环计数器,状态切换

3.告别var

  • 在现代JS项目中,应避免使用var
请谈谈var,let,const的区别

回答:

1.作用域规则不同

  • var:函数作用域
  • let/const:块级作用域({…})
    • 解决了var在if/for中变量泄露的问题

2.提升与TDZ(暂时性死区)

  • var:变量提升
    • 声明前可访问,值为undefined
  • let/const:存在暂时性死区(TDZ)
    • 声明前访问,直接抛出ReferenceError

3.赋值与声明

  • var:可重复声明,可重新赋值
  • let:不可重复声明,可重新赋值
  • const: 不可重新声明,不可重新赋值
    • 解释const对引用类型(对象/数组)的含义

核心总结

  • 块级作用域

    let和const提供了更可靠的变量隔离

  • 暂时性死区(TDZ)

    let和const让变量访问更安全,更符合直觉

  • 优先const

    默认使用const,仅在需要重新赋值时改用let


网站公告

今日签到

点亮在社区的每一天
去签到