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

JavaScript中声明变量的关键字const/let/var区别

这三个关键字隔一段时间就会忘记区别,需要把这三个的区别记录一下

在 JavaScript 中,constletvar 都用于声明变量,但它们在 作用域提升(hoisting)重复声明可变性 等方面有显著区别

1. 作用域(Scope)

关键字作用域类型示例
var函数作用域(Function Scope)在整个函数内有效
let块级作用域(Block Scope)仅在 {} 内有效
const块级作用域(Block Scope)仅在 {} 内有效

例如:

function scopeExample() {if (true) {var varVar = "var"; // 函数作用域let letVar = "let"; // 块级作用域const constVar = "const"; // 块级作用域}console.log(varVar); // "var"(可以访问)console.log(letVar); // 报错:letVar is not definedconsole.log(constVar); // 报错:constVar is not defined
}
scopeExample();

2. 变量提升(Hoisting)

关键字是否提升初始化值
var(声明提升,赋值不提升)undefined
let(但存在 暂时性死区未初始化
const(但存在 暂时性死区必须初始化
console.log(a); // undefined(var 提升)
var a = 10;console.log(b); // 报错:Cannot access 'b' before initialization(let 提升但未初始化)
let b = 20;console.log(c); // 报错:Cannot access 'c' before initialization(const 提升但未初始化)
const c = 30;

3. 重复声明

关键字是否允许重复声明
var允许(会覆盖)
let不允许(报错)
const不允许(报错)
var x = 10;
var x = 20; // 允许let y = 10;
let y = 20; // 报错:Identifier 'y' has already been declaredconst z = 10;
const z = 20; // 报错:Identifier 'z' has already been declared

4. 可变性(Reassignment)

关键字是否可重新赋值是否可变(对象/数组)
var可以可以修改
let可以可以修改
const不可以(但对象/数组内容可修改)可以修改
var a = 10;
a = 20; // 允许let b = 10;
b = 20; // 允许const c = 10;
c = 20; // 报错:Assignment to constant variable// 但对象/数组可以修改内容
const obj = { name: "Alice" };
obj.name = "Bob"; // 允许
obj = {}; // 报错(不能重新赋值)

5. 最佳实践

关键字适用场景
const默认使用(推荐),适用于常量、对象、数组
let需要重新赋值时(如循环变量)
var避免使用(旧代码或特殊需求)
// 默认用 const
const PI = 3.14;
const user = { name: "Alice" };// 需要重新赋值时用 let
let count = 0;
count++;// 避免 var
var oldVar = "avoid"; // ❌ 不推荐

总结

特性varletconst
作用域函数作用域块级作用域块级作用域
提升是(初始 undefined是(暂时性死区)是(暂时性死区)
重复声明允许不允许不允许
重新赋值允许允许不允许(但对象/数组内容可变)
默认值undefined未初始化必须初始化

现代 JavaScript 开发建议

  1. 优先使用 const(默认选择)。
  2. 需要重新赋值时用 let
  3. 避免使用 var(除非维护旧代码)。

⚠️以上内容部分源于大模型,如有雷同,联系修改

http://www.xdnf.cn/news/13791.html

相关文章:

  • 13-Linux启动流程和内核管理自我总结
  • python根据图片路径获取文件后缀名
  • Spring Boot Actuator 健康信息
  • OpenLayers 动画
  • 零基础RT-thread第一节:串口通信UART
  • C语言——指针
  • 实现AI数据高效评估的一种方法
  • 分水岭边缘提取和hough提取边缘
  • ubuntu20上 : mujoco210安装教程
  • 计算机系统设计:E-R图、类图、时序图、功能结构图、流程图、用例图、架构图
  • 【ARMv7-A】——CLZ 指令
  • 【25-cv-06400、25-cv-06413】Keith律所再次代理Elizabeth Anne Evans蝴蝶版权画
  • 使用MetaGPT 创建智能体(3)常用操作和晋级
  • < 自用文儿 腾讯云 VPS > Ubuntu 24 系统,基本设置
  • 无人机接收机运行技术要点分析!
  • 基于SC内存一致性模型两个核心约束的放松维度
  • Systemctl 手记:从服务管理到资源控制的进阶实践
  • AI时代,学习力进化指南:如何成为知识的主人?
  • JSON 与 AJAX
  • 开疆智能ModbusTCP转Devicenet网关连接ABB机器人配置案例
  • 网页中调用自定义字体可以通过 ‌CSS‌ 的 @font-face 规则实现
  • Vue 跳转页面,第一次进页面,会出现样式混乱,刷新后即恢复正常(问题已解决)
  • 进程和计划任务管理
  • 剑指offer23_树的子结构
  • ESP32S3 关于使用INMP441麦克风 和MAX98357AETE功放进行录音和播放
  • 复现论文报错解决
  • 新手速学:在线投票制作系统操作详细步骤
  • centos clamav 扫描及告警配置
  • 内网渗透测试技巧与利用操作手册(SMB / MSSQL / LDAP)
  • 全志A33安卓6.0添加支持usb摄像头动态热插拔