var、let、const区别

news/2025/2/23 15:06:51

在 JavaScript 中,varlet 和 const 是用于声明变量的关键字,但它们的作用域、提升行为以及可变性等方面有显著区别。以下是它们的详细对比:


1. var

  • 作用域:

    • var 声明的变量是函数作用域(function-scoped),即在函数内部声明的变量只能在函数内部访问。

    • 如果在函数外部声明,则为全局作用域。

  • 提升(Hoisting):

    • var 声明的变量会被提升到其作用域的顶部,但赋值不会被提升。

    • 在声明之前访问变量会得到 undefined

  • 重复声明:

    • 允许重复声明同一个变量,不会报错。

  • 示例:

    javascript">function example() {
      console.log(x); // undefined (变量提升)
      var x = 10;
      console.log(x); // 10
    }
    example();

2. let

  • 作用域:

    • let 声明的变量是块级作用域(block-scoped),即只在 {} 代码块内有效。

    • 适用于循环、条件语句等块级作用域场景。

  • 提升(Hoisting):

    • let 声明的变量也会被提升,但不会初始化,访问时会抛出 ReferenceError(暂时性死区,TDZ)。

  • 重复声明:

    • 不允许在同一个作用域内重复声明同一个变量。

  • 示例:

    javascript">if (true) {
      let y = 20;
      console.log(y); // 20
    }
    console.log(y); // ReferenceError: y is not defined

3. const

  • 作用域:

    • const 声明的变量也是块级作用域(block-scoped)。

  • 提升(Hoisting):

    • 与 let 类似,const 声明的变量也会被提升,但不会初始化,访问时会抛出 ReferenceError

  • 可变性:

    • const 声明的变量必须初始化,且不能重新赋值。

    • 如果变量是对象或数组,其属性或元素可以修改,但变量本身不能重新赋值。

  • 重复声明:

    • 不允许在同一个作用域内重复声明同一个变量。

  • 示例:

    javascript">const z = 30;
    z = 40; // TypeError: Assignment to constant variable
    
    const obj = { a: 1 };
    obj.a = 2; // 合法,修改属性
    obj = {}; // TypeError: Assignment to constant variable

4. varlet 和 const 的区别

(Temporal Dead Zone,暂时性死区) 

特性varletconst
作用域函数作用域块级作用域块级作用域
提升变量提升,初始化为 undefined变量提升,但不初始化(TDZ)变量提升,但不初始化(TDZ)
重复声明允许不允许不允许
可变性可以重新赋值可以重新赋值不可重新赋值(对象属性可修改)
适用场景旧代码兼容需要块级作用域的变量需要不可变的常量

5. 使用建议

  • 避免使用 var:

    • var 的作用域和提升行为容易导致 bug,现代 JavaScript 开发中建议避免使用。

  • 优先使用 const:

    • 如果变量的值不需要改变,优先使用 const,以确保变量的不可变性。

  • 必要时使用 let:

    • 如果变量的值需要改变,使用 let


6. 总结

  • var:

    • 函数作用域,变量提升,允许重复声明。

  • let:

    • 块级作用域,变量提升但不初始化,不允许重复声明。

  • const:

    • 块级作用域,变量提升但不初始化,不允许重复声明,不可重新赋值。

根据实际需求选择合适的变量声明方式,可以提高代码的可读性和可维护性。


http://www.niftyadmin.cn/n/5863510.html

相关文章

Alice与Bob-素数分解密码学

题目描述 有一个大的整数,98554799767,请分解为两个素数,分解后,小的放前面,大的放后面,合成一个新的数字,进行md5的32位小写哈希 def su(num):lt[]print(num,,end)while num!1:for i in rang…

DeepSeek和ChatGPT在科研课题设计和SCI论文写作中的应用

DeepSeek和ChatGPT在科研课题设计和SCI论文写作中的应用 一、DeepSeek和ChatGPT的基础理论 (理论讲解案例分析) 1.DeepSeek的技术架构 (1)DeepSeek的定义与核心目标 (2)DeepSeek的主要类型 如DeepSeek-R1、DeepSeek-V3等 (3)DeepSeek的主要创新点、优势能力以及主要应用场景 2.…

java开发——为什么要使用动态代理?

举个例子:假如有一个杀手专杀男的,不杀女的。代码如下: public interface Killer {void kill(String name, String sex);void watch(String name); }public class ManKiller implements Killer {Overridepublic void kill(String name, Stri…

25工程管理研究生复试面试问题汇总 工程管理专业知识问题很全! 工程管理复试全流程攻略 工程管理考研复试真题汇总

工程管理复试面试心里没底?别慌!学姐手把手教你怎么应对复试! 很多同学面对复试总担心踩坑,其实只要避开雷区掌握核心技巧,逆袭上岸完全有可能!这份保姆级指南帮你快速锁定重点,时间紧迫优先背…

运维脚本——9.配置漂移检测

场景:检测服务器配置与基准配置的差异,防止未经授权的修改。 示例:使用Ansible Playbook对比当前配置与标准模板。 - hosts: alltasks:- name: Check SSH configuration against baselineansible.builtin.diff:path: /etc/ssh/sshd_configori…

【Alertmanager】alertmanager告警多种通知方式--企业微信告警、钉钉告警、电话和短信告警

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全…

格行物联网代理项目技术解析:三网切换与AI识别如何赋能轻资产创业?格行随身WiFi和视精灵代理靠谱吗?格行乡村万店计划可行性深度分析!低成本的小生意有哪些?

一、市场可行性 市场需求基础 当前移动网络需求呈现多样化特征,覆盖短租客、物流从业者、户外直播等群体,且5G技术普及加速了物联网设备的应用场景扩展。同时,智能安防领域因家庭与商业场景需求增长,双目摄像头及AI识别技术的应用…

边缘安全加速(ESA)套餐

为帮助不同规模和需求的企业选择合适的解决方案,边缘安全加速(ESA)提供了多种套餐。以下是四种主要套餐的介绍,每个套餐都根据企业需求提供不同的功能和服务水平,从基础安全保护到企业级的全面防护与加速。 1. 各版本详…