当前位置: 首页 > news >正文

JavaScript 中 let、var、const 的区别详解

目录

1. 基本概念

1.1 var

1.2 let

1.3 const

2. 三者区别对比表

3. 使用建议

4. 总结


在 JavaScript 中,声明变量的方式主要有三种:varletconst。它们看似只是语法不同,但在作用域、提升(Hoisting)、可变性等方面有明显区别。本文将详细讲解它们的特性和使用场景。

1. 基本概念

1.1 var

  • 出现时间:ES5 及之前版本唯一的变量声明方式

  • 作用域函数作用域(function scope)或全局作用域

  • 变量提升:会被提升到当前作用域顶部,未赋值前默认为 undefined

  • 可重复声明:同一作用域内可以重复声明同名变量

  • 适用场景:现在已不推荐使用,除非是为了兼容旧代码

    console.log(a); // undefined(已提升)
    var a = 10;function testVar() {var b = 20;if (true) {var b = 30; // 同一函数作用域}console.log(b); // 30
    }
    testVar();
    

    1.2 let

  • 出现时间:ES6 引入

  • 作用域块级作用域(block scope)

  • 变量提升:会提升,但处于暂时性死区(TDZ),在声明前访问会报错

  • 可重复声明:同一作用域内不能重复声明同名变量

  • 适用场景:声明会变化的变量(推荐使用)

    // 暂时性死区示例
    {// console.log(c); // ReferenceErrorlet c = 10;console.log(c); // 10
    }// 块级作用域
    function testLet() {let x = 1;if (true) {let x = 2; // 与外层 x 不同console.log(x); // 2}console.log(x); // 1
    }
    testLet();
    

    1.3 const

  • 出现时间:ES6 引入

  • 作用域块级作用域

  • 变量提升:同样存在,但受暂时性死区影响

  • 可重复声明:不能重复声明同名变量

  • 必须初始化:声明时必须赋值

  • 不可更改绑定:变量绑定的引用不可更改,但如果是对象或数组,内容是可变的

    const PI = 3.14159;
    // PI = 3; // TypeError: Assignment to constant variable.const arr = [1, 2, 3];
    arr.push(4); // 允许
    console.log(arr); // [1, 2, 3, 4]const obj = {name: 'Tom'};
    obj.age = 18; // 允许
    console.log(obj); // {name: 'Tom', age: 18}
    

2. 三者区别对比表

特性varletconst
作用域函数作用域/全局作用域块级作用域块级作用域
变量提升有,初始化为 undefined有(TDZ 限制)有(TDZ 限制)
重复声明允许不允许不允许
必须初始化
可重新赋值否(引用不可变)
常用场景旧代码兼容会变化的值常量或引用不变的值

3. 使用建议

  1. 优先使用 const
    如果变量不会被重新赋值,用 const 可以避免意外修改。

  2. 需要修改的变量用 let
    当变量需要多次赋值时使用 let,保证块级作用域安全。

  3. 尽量避免 var
    除非维护旧项目或必须兼容低版本浏览器,否则不推荐使用 var

4. 总结

  • var旧时代的选择,函数作用域,变量提升,容易出 bug

  • let现代可变变量,块级作用域,安全性高

  • const现代常量,块级作用域,引用不可变(对象内容可变)

在实际开发中,一般遵循这样的原则:

先用 const,如果需要修改值再改为 let,避免使用 var

http://www.dtcms.com/a/329119.html

相关文章:

  • 如何用外部电脑访问本地网页?
  • Leetcode题解:215,数组中的第k个最大元素,如何使用快速算法解决!
  • 6 ABP 框架中的事件总线与分布式事件
  • 豆包 + 蘑兔 AI:圆你创作歌曲梦​
  • JavaWeb-Servlet基础
  • 4.0 vue3简介
  • 【深入浅出STM32(1)】 GPIO 深度解析:引脚特性、工作模式、速度选型及上下拉电阻详解
  • 【Docker项目实战】使用Docker部署todo任务管理器
  • [AI React Web]`意图识别`引擎 | `上下文选择算法` | `url内容抓取` | 截图捕获
  • Android 双屏异显技术全解析:从原理到实战的多屏交互方案
  • 开发手记:一个支持自动翻译的H5客服系统
  • TeamViewer 以数字化之力,赋能零售企业效率与客户体验双提升
  • 在线 A2C实践
  • 玩转Docker | 使用Docker部署MediaWiki文档管理平台
  • 大文件上传解决方案
  • React useMemo 深度指南:原理、误区、实战与 2025 最佳实践
  • 【SpringBoot系列-01】Spring Boot 启动原理深度解析
  • C->C++核心过渡语法精讲与实战
  • 深度学习——03 神经网络(2)-损失函数
  • Spring Boot 使用 @NotBlank + @Validated 优雅校验参数
  • react+antd+vite自动引入组件、图标等
  • 适配安卓15(对应的sdk是35)
  • 单片机启动流程详细介绍
  • 开源WAF新标杆:雷池SafeLine用语义分析重构网站安全边界
  • vscode远程服务器出现一直卡在正在打开远程和连接超时解决办法
  • SpringBoot 整合 Langchain4j 系统提示词与用户提示词实战详解
  • IV模型(工具变量模型)
  • 《论文阅读》从特质到移情:人格意识多模态移情反应生成 ACL 2025
  • Dify-17: 扩展模型提供方
  • PyTorch简介