前端八股: var、let、const 的区别

发布时间:2026/10/7 15:31:36

前端八股: var、let、const 的区别 在 JavaScript 中var、let、const都可以声明变量但它们在作用域、变量提升、重复声明、修改值等方面有明显区别。先看一个总表特性varletconst作用域函数作用域块级作用域块级作用域变量提升有可提前访问值是undefined有但存在 TDZ有但存在 TDZ重复声明可以不可以不可以重新赋值可以可以不可以声明时必须赋值不需要不需要必须一、作用域区别var函数作用域var没有真正的块级作用域。if (true) { var a 10 } console.log(a) // 10虽然a写在{}里面但外面依然可以访问。因为var主要受函数作用域限制而不是普通代码块。比如function test() { var a 10 } console.log(a) // 报错这里a只能在test函数内部使用。let 和 const块级作用域let和const都存在块级作用域。if (true) { let a 10 const b 20 } console.log(a) // 报错 console.log(b) // 报错这里的{ }就形成了一个作用域。所以let和const只在当前代码块中有效。二、什么是变量提升JavaScript 在执行代码之前会先处理变量和函数声明。这种现象通常叫变量提升 Hoisting例如console.log(a) var a 10不会报错而是输出undefined可以粗略理解成var a console.log(a) a 10所以var声明会被提升并且初始化为undefined。三、let 和 const 也有变量提升吗有。但是不能在声明之前访问。例如console.log(a) let a 10会直接报错ReferenceErrorconst也是一样console.log(a) const a 10同样报错。所以更准确地说let和const也会被提升但是在真正执行到声明语句之前不能访问。这段区域就叫TDZ暂时性死区 Temporal Dead Zone四、什么是 TDZ例如{ console.log(a) let a 10 }从进入这个作用域开始到执行let a 10之前这一段区域就是a的暂时性死区。可以理解成进入作用域 ↓ TDZ 开始 ↓ console.log(a) // 不能访问 ↓ let a 10 ↓ TDZ 结束 ↓ 之后可以正常使用 a所以不是let完全没有变量提升。而是提升了但在初始化之前不能访问。const同样如此。五、重复声明的区别var可以重复声明var a 10 var a 20 console.log(a) // 20但是let不可以let a 10 let a 20会报错。const也不可以const a 10 const a 20同样报错。所以var → 可以重复声明 let → 不可以 const → 不可以这也是现在更推荐使用let和const的原因之一可以减少变量重复声明带来的问题。六、重新赋值的区别var可以重新赋值var a 10 a 20let也可以let a 10 a 20但是const a 10 a 20会报错。因为const声明以后不能重新给这个变量赋另一个值。七、const 真的完全不能修改吗这是最容易误解的地方。例如const obj { name: Tom } obj.name Jack这是允许的。甚至obj.age 18也是允许的。但是obj {}不允许。为什么因为const限制的是变量本身保存的引用不能改变。不是对象里面的内容完全不能修改。可以这样理解const obj { name: Tom }变量obj保存的是一个对象的引用obj ↓ 对象 { name: Tom }你修改obj.name Jack只是修改对象内部内容。引用没有变化obj ↓ 还是原来的对象所以允许。但如果obj {}相当于obj ↓ 换成另一个对象引用发生变化所以报错。八、const 声明时为什么必须赋值下面这样不行const a因为const创建后不能重新赋值。如果声明的时候不给值后面就没办法再赋值了。所以必须const a 10而let可以let a a 10九、为什么现在不推荐使用 var主要因为var有几个容易产生问题的地方。比如没有块级作用域for (var i 0; i 3; i) { } console.log(i) // 3i跑到了循环外面。而for (let i 0; i 3; i) { } console.log(i) // 报错let的i只存在于循环作用域中。另外var还能重复声明var name Tom var name Jack有时候可能不小心覆盖前面的变量。所以现代 JavaScript 基本推荐优先 const ↓ 需要重新赋值时用 let ↓ 尽量不用 var十、let 和 const 怎么选择可以记一个非常实用的原则默认使用 const需要重新赋值时再改成 let。比如const user { name: Tom }对象本身不会换掉用const如果let count 0 count因为count会变化所以用let十一、面试最容易问的几个点1. var 和 let 最大区别是什么可以答var是函数作用域let是块级作用域var可以重复声明并且声明提升后值为undefined而let存在暂时性死区声明前不能访问。2. let 有变量提升吗有。只是提升后没有立即初始化声明前处于 TDZ所以不能访问。3. const 对象为什么还能修改因为const限制的是变量绑定也就是引用地址不能重新赋值不限制对象内部属性修改。例如const obj {} obj.a 1 // 可以 obj {} // 不可以总结var、let、const最核心的区别可以压缩成var → 函数作用域 → 可以重复声明 → 可以重新赋值 → 声明提升后是 undefinedlet → 块级作用域 → 不能重复声明 → 可以重新赋值 → 存在 TDZconst → 块级作用域 → 不能重复声明 → 不能重新赋值 → 存在 TDZ → 声明时必须赋值最后记住两个最重要的点let/const都有变量提升只是存在 TDZ。以及const不是“值完全不能变”而是“变量不能重新指向另一个值”。实际开发中建议默认 const 需要重新赋值 → let 尽量不用 var
延伸阅读

更多相关文章

2026/10/7 15:31:36

Steam秋季促销倒计时,RTX50系高刷游戏本盘点:50系同价位选购指南

一、活动背景Steam秋季促销从10月2日凌晨1点持续到10月9日凌晨1点,正好覆盖整个国庆假期期间3A开放世界、FPS竞技、RPG冒险等全品类基本都会触达年度史低,部分热门大作折扣力度甚至超过夏促二、五款推荐机型1.华硕天选7Pro酷睿版配置:酷睿Ult…

2026/10/7 15:31:36

《创业之路》-1017-细读商业经典 - 长期主义的内涵

长期主义是商业世界被谈论最多,也被误解最多的概念之一。很多人把它等同于 “坚持”“熬时间”“十年磨一剑”,但翻遍《基业长青》《德鲁克论管理》以及贝佐斯的股东信就会发现:长期主义从来不是意志层面的 “死磕”,而是一套穿越…

2026/10/7 15:26:36

做题小技巧

目录 时间复杂度 快速读写 二进制高级用法 特殊关键字 下面我为大家分享一些做题小技巧。 时间复杂度 下为时间复杂度对应的数据规模。 极大约1e8约1e6约5000约500约20约12 快速读写 在代码开头加入这段代码: ios::sync_with_stdio(0); cin.tie(0); cout.…

2026/10/7 19:06:53

Winform Timer 到不了 1ms?QPC 高精度计时器原理与实战

简介:这是面向.NET与WinForm开发场景的C#高精度计时器组件,使用PrecisionTimer.NET动态库封装,可解决系统默认计时器在毫秒级精度不足、时间漂移明显的问题,适用于数据采集节拍控制、动画帧率校正、自动化流程定时等对时间敏感的场…

2026/10/7 19:06:53

K8S业务禁令黑名单:五条技术路线实现快速服务隔离与权限封禁

昨天半夜我被一条告警从被窝里拽了起来。某个内部数据服务突然开始疯狂向外发起连接,CPU 直接打满,同事的第一反应是“把它删了”,但生产环境里的服务哪敢说删就删——删了影响面更大,而且后续还要查日志、留证据。最后我们做的操…

2026/10/7 19:06:53

模拟电子技术实战指南:从电路失真诊断到器件物理行为理解

1. 这不是复习资料,是“电路听诊器”使用说明书你有没有过这种体验:翻开模电课本,看到共射放大电路图,第一反应不是分析Q点,而是下意识摸手机查“共射放大电路为什么叫共射”;做题时看到负反馈类型判断&…

2026/10/7 19:06:53

hp1008打印机驱动zip包:GDI机制与系统兼容性安装指南

简介:打印机驱动是操作系统与打印设备之间的关键桥梁,其工作原理直接影响到设备的稳定性和输出质量。以惠普LaserJet 1008为例,这款老机型采用GDI打印模式,电脑端负责渲染位图,因此驱动文件对系统版本极为敏感——32位…

2026/10/7 19:06:53

Django流量计远程抄表系统实战:从串口采集到Web展示

简介:这是一份基于Python Django框架开发的毕业设计项目源码,面向计算机相关专业学生及Web开发初学者,可用于完成流量计远程抄表管理系统。系统涵盖用户登录、权限管理、设备管理、数据报表等功能,并通过网络采集流量计数据实现远…

2026/10/7 19:01:53

YOLOv5+霍夫变换协同车道线检测实战

简介:本资源是一套基于YOLOv5与霍夫变换融合实现的车道线检测完整项目,面向计算机、人工智能、自动化等专业学生及初学者,解决无需大规模标注数据即可完成车道线识别的实际问题,适用于课程设计、毕设立项、算法验证与进阶学习。压…

2026/10/5 6:32:56

Jev+Agent接管浏览器:browser-use实战与jev-ultrafast性能优化

1. 从“Jev”说起:为什么我要把Agent接进浏览器“Jev”这个词最近在圈子里出现的频率越来越高,很多人第一次听到会以为是某个新模型的名字,其实它更像是一种思路——把Jev模型的能力当作底座,通过Agent的方式去接管浏览器&#xf…

2026/10/7 8:18:33

多智能体集群实战:DeepAgents编排、MCP与A2A协议及Skills体系

1. 从"单兵作战"到"集群协同":多智能体编排到底在解决什么问题如果你最近在折腾 Agent 相关的东西,大概率会有一种感觉:单个 Agent 能做的事情,其实很快就摸到天花板了。你给它一个提示词,挂几个工…

2026/10/6 17:46:51

无源低通滤波器设计实战:从RC到LC,手把手教你避开那些坑

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 1:05:03

ESP32免重刷固件:浏览器直接修改NVS键值实现WiFi配置更新

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 1:05:03

SAP HANA查询结果导出CSV:避开乱码、性能与权限的实用指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 1:05:03

数字后端Placement阶段Density与Congestion控制实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑