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

JavaScript let 和 const

JavaScriptletconst学习笔记

ES6 (ECMAScript 2015) 引入了letconst,解决了var存在的变量提升作用域污染重复声明等问题。


1.核心对比表

特性varletconst
作用域函数作用域块级作用域({})块级作用域({})
变量提升是 (值为undefined)是 (但处于暂时性死区)是 (但处于暂时性死区)
重复声明允许不允许不允许
重新赋值允许允许不允许(必须初始化)
全局对象属性是 (window.x)
适用场景(不推荐)需要变化的变量常量或引用不变的变量

2.let详解

基本用法

用于声明块级作用域的变量,允许重新赋值。

// 块级作用域示例if(true){letx=10;console.log(x);// 10}console.log(x);// ReferenceError: x is not defined// 循环中的经典用法for(leti=0;i<3;i++){setTimeout(()=>console.log(i),100);}// 输出:0, 1, 2 (每个循环都有独立的 i)
暂时性死区 (Temporal Dead Zone, TDZ)

在代码块中,let声明的变量在声明语句之前访问会报错。

console.log(a);// ReferenceError: Cannot access 'a' before initializationleta=5;

对比varvar会提升并初始化为undefined,而let在 TDZ 期间完全不可访问。

不允许重复声明
letx=1;letx=2;// SyntaxError: Identifier 'x' has already been declared// 函数参数也不能重复functiontest(a,a){}// SyntaxError

3.const详解

基本用法

用于声明常量,声明时必须初始化,且不能重新赋值

constPI=3.14159;PI=3.14;// TypeError: Assignment to constant variable.// 必须初始化constx;// SyntaxError: Missing initializer in const declaration
对象和数组的“常量”陷阱

const保证的是变量指向的内存地址不变,而不是对象内容不变。

constarr=[1,2,3];arr.push(4);// ✅ 允许:修改数组内容arr=[5,6];// ❌ 报错:不能重新赋值给新数组constobj={name:'Alice'};obj.age=25;// ✅ 允许:修改对象属性obj={};// ❌ 报错:不能重新赋值给新对象
冻结对象 (Deep Freeze)

如果需要完全禁止修改对象,需使用Object.freeze()

constfrozenObj=Object.freeze({name:'Bob'});frozenObj.name='Tom';// 静默失败 (严格模式下报错)

4.作用域对比:varvslet/const

函数作用域 vs 块级作用域
// var: 函数作用域functiontestVar(){if(true){varx=1;}console.log(x);// 1 (x 泄露到了函数外部)}// let/const: 块级作用域functiontestLet(){if(true){lety=2;constz=3;}console.log(y);// ReferenceErrorconsole.log(z);// ReferenceError}
全局作用域
vara=1;letb=2;constc=3;console.log(window.a);// 1 (var 挂载到 window)console.log(window.b);// undefined (let 不挂载)console.log(window.c);// undefined (const 不挂载)

5.常见陷阱与最佳实践

陷阱 1:循环中的闭包问题
// ❌ var 导致所有定时器共享同一个 ifor(vari=0;i<3;i++){setTimeout(()=>console.log(i),100);}// 输出:3, 3, 3// ✅ let 为每次循环创建新的绑定for(leti=0;i<3;i++){setTimeout(()=>console.log(i),100);}// 输出:0, 1, 2
陷阱 2:解构赋值
// 解构声明let[a,b]=[1,2];const{name,age}={name:'Tom',age:20};// 重新赋值[a,b]=[3,4];// ✅ 允许 (let)// { name, age } = { name: 'Jerry', age: 25 }; // ❌ 报错 (const 需加括号)({name,age}={name:'Jerry',age:25});// ✅ 允许 (加括号避免语法歧义)
最佳实践
  1. 默认使用const:如果变量不需要重新赋值,优先用const
  2. 需要变化时用let:仅在变量需要重新赋值时使用let
  3. 避免使用var:除非维护旧代码,否则不再使用var
  4. 声明即初始化const必须立即赋值。
  5. 命名规范:常量通常使用UPPER_SNAKE_CASE(如MAX_COUNT)。

6.快速决策指南

// 1. 这个值以后会变吗?// 是 -> let// 否 -> const// 2. 是对象或数组吗?// 是 -> const (内容可变,但引用不变)// 否 -> const (基本类型)// 3. 需要循环计数器吗?// 是 -> let (for 循环)// 示例constMAX_USERS=100;// 常量letcount=0;// 计数器constusers=[];// 数组引用不变,内容可变constconfig={theme:'dark'};// 对象引用不变

7.总结

场景推荐关键字
常量 (数字、字符串、布尔值)const
对象、数组 (引用不变)const
循环计数器let
需要重新赋值的变量let
函数参数const(默认)
模块导出const

核心原则“能不用let就不用let,能不用var就绝对不用var。”

http://www.jsqmd.com/news/660612/

相关文章:

  • 手把手教你用旧安卓机顶盒看家里监控(支持海康/大华RTSP流)
  • 首陀双拼,首药双拼,首师双拼
  • 不止于查询:用tldr、cheat和howdoi打造你的命令行‘外挂’记忆系统
  • Windows平台第三方软件注入技术挑战与BetterNCM安装器的创新解决方案
  • 选AI搜索优化专业公司看什么,知名品牌深度评测与推荐 - 工业品网
  • 会议灭绝计划:异步决策在远程团队的暴力实践
  • Adobe-GenP 3.0完整指南:专业级Adobe全家桶激活解决方案
  • Activiti监听器填坑指南:Expression、DelegateExpression和Class三种方式到底怎么选?
  • 智能代码生成可读性危机(2024行业白皮书首发):87%的LLM生成函数存在命名熵超标问题
  • 2026年好用的家具五金洗衣机抽拉衣架厂家推荐,帮你如何选择 - myqiye
  • 如何免费解锁《鸣潮》120帧:WaveTools完整优化教程
  • 免费开源歌词滚动姬:网页版LRC歌词制作工具终极指南
  • 如何高效使用开源岛屿设计工具:专业地形规划完整指南
  • 2026年靠谱的月饼封口机专业供应商推荐,性价比高的品牌怎么选 - 工业设备
  • 第2天:Python变量与数据类型
  • 终极指南:如何用CAD_Sketcher在Blender中实现参数化草图设计
  • MedGemma-X医疗场景应用:提升放射科工作效率的智能方案
  • 必选 KyOps!AI 运维平台的实力之选,降本增效一步到位 - 企业推荐官【官方】
  • 2025最权威的十大AI学术网站推荐榜单
  • 华为CE交换机自动化入门:从ESNP模拟器到Ansible Playbook的完整实验指南
  • 群里接龙别乱用!这 3 个问题大多数人都踩过
  • 调参避坑指南:FCM算法中那个神秘的加权指数m到底怎么选?(附Python实验)
  • 手把手带你跑通VTM10.0的GPM:从环境配置到性能分析全流程指南
  • 从WannaCry到无文件攻击:Security+视角下的恶意软件进化史与防御策略升级
  • 如何永久保存喜马拉雅付费音频:跨平台下载工具完全指南
  • BabelDOC:如何解决传统PDF翻译工具的三大痛点?
  • PN结与二极管:从理论到实践,手把手教你用万用表检测二极管好坏
  • 【智能代码生成×代码推荐融合实战指南】:20年架构师亲授3大协同增效模型与5个避坑红线
  • 终极指南:如何绕过Cursor AI试用限制,永久解锁免费VIP功能
  • 源代码反编译工具JD-GUI详解