跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
JavaScriptNode.js大前端

JavaScript 中 var、let、const 的核心区别与实战应用

详细解析了 JavaScript 中 var、let、const 三种变量声明方式的核心区别,涵盖作用域(函数作用域 vs 块级作用域)、变量提升机制及可修改性。通过代码示例展示了 var 的变量提升与重复声明问题,let 的暂时性死区特性,以及 const 对引用的不可变性约束。文章提供了最佳实践建议:优先使用 const 声明常量或固定引用对象,仅在需要重新赋值时使用 let,并避免使用易引发 Bug 的 var。同时列举了常见误用场景及修正方案,帮助开发者编写更规范、安全的代码。

SparkGeek发布于 2026/4/6更新于 2026/8/2644 浏览
JavaScript 中 var、let、const 的核心区别与实战应用

JavaScript 中 var、let、const 的核心区别与实战应用

要理解 const、var、let 的区别,我们可以从 作用域、变量提升、可重复声明、可修改性 这几个核心维度展开。

一、核心概念铺垫

首先明确两个基础概念:

  • 函数作用域:变量只在声明它的函数内部可访问(var 是函数作用域)。
  • 块级作用域:变量只在声明它的 {} 内部可访问(let/const 是块级作用域,{} 包括 if/for/while/普通代码块)。
  • 变量提升:JS 引擎在执行代码前,会把变量声明'提升'到当前作用域顶部(但赋值不会提升)。

二、逐个拆解与对比

1. var(ES5 语法)

var 是 ES5 中声明变量的方式,特性如下:

  • 作用域:函数作用域(无块级作用域)。
  • 变量提升:声明会被提升,且提升后默认值为 undefined。
  • 可重复声明:同一作用域内可重复声明同一个变量,后声明的会覆盖前一个。
  • 可修改:声明后可随意修改值。
// 1. 函数作用域(无块级作用域)
if (true) {
    var a = 10;
}
console.log(a); // 输出 10(a 跳出了 if 的 {},因为 var 无块级作用域)

// 2. 变量提升
console.log(b); // 输出 undefined(声明提升了,赋值没提升)
var b = 20;

// 3. 可重复声明
var c = 30;
var c = 40;
console.log(c); // 输出 40(后声明的覆盖前一个)

// 4. 可修改
var d = 50;
d = 60;
console.log(d); // 输出 60

2. let(ES6 语法)

let 是 ES6 为解决 var 的缺陷新增的声明方式,特性如下:

  • 作用域:块级作用域(被 {} 限制)。
  • 变量提升:存在'暂时性死区(TDZ)'——声明也会提升,但提升后不会赋值 undefined,在声明前访问会报错。
  • 不可重复声明:同一作用域内不能重复声明同一个变量(包括不能和 var/const 重复)。
  • 可修改:声明后可修改值。
// 1. 块级作用域
if (true) {
    let a = 10;
}
console.log(a); // 报错:a is not defined(a 被 if 的 {} 限制,外部访问不到)

// 2. 暂时性死区
console.log(b); // 报错:Cannot access 'b' before initialization
let b = 20;

// 3. 不可重复声明
let c = 30;
// let c = 40; // 报错:Identifier 'c' has already been declared
// var c = 40; // 同样报错

// 4. 可修改
let d = 50;
d = 60;
console.log(d); // 输出 60

3. const(ES6 语法)

const 用于声明常量,特性和 let 基本一致,核心区别是不可修改:

  • 作用域:块级作用域(和 let 完全一样)。
  • 变量提升:同样有暂时性死区(和 let 完全一样)。
  • 不可重复声明:和 let 完全一样。
  • 不可修改:声明时必须赋值,且赋值后不能修改引用(注意:如果是对象/数组,内部属性/元素可修改)。
// 1. 块级作用域
if (true) {
    const a = 10;
}
console.log(a); // 报错:a is not defined

// 2. 暂时性死区
console.log(b); // 报错:Cannot access 'b' before initialization
const b = 20;

// 3. 不可重复声明
const c = 30;
// const c = 40; // 报错

// 4. 声明时必须赋值
// const d; // 报错:Missing initializer in const declaration

// 5. 不可修改引用(重点)
const e = 50;
// e = 60; // 报错:Assignment to constant variable.

// 注意:对象/数组的内部可修改(只是引用不能变)
const obj = { name: "张三" };
obj.name = "李四"; // 正常执行,输出 { name: '李四' }
console.log(obj);

const arr = [1, 2];
arr.push(3); // 正常执行,输出 [1,2,3]
console.log(arr);

三、核心区别对比表

特性varletconst
作用域函数作用域块级作用域块级作用域
变量提升有(提升为 undefined)有(暂时性死区)有(暂时性死区)
重复声明允许不允许不允许
声明后赋值允许(默认 undefined)允许(默认未初始化)不允许(必须立即赋值)
修改值允许允许引用不可改(对象/数组内部可改)

四、实际开发中的使用建议

  1. 优先用 const:声明不需要修改的变量(如常量、固定引用的对象/数组),能减少代码意外修改的风险。
  2. 其次用 let:声明需要修改的变量(如循环变量、状态变量)。
  3. 完全不用 var:var 的函数作用域和变量提升容易导致 bug(比如循环变量泄露、重复声明覆盖),ES6 后已被 let/const 替代。

1. const 的使用场景

适合以下所有'不需要修改值/引用'的场景:

  • 声明常量:数学常量、配置项、固定字符串等。
// 数学常量
const PI = 3.1415926;
const RADIUS = 5;
const AREA = PI * RADIUS * RADIUS;

// 配置项
const BASE_URL = 'https://api.example.com';
const TOKEN = 'abc123456';

// 固定字符串
const TITLE = '个人信息';
  • 声明不需要重新赋值的对象/数组:const 只是限制'引用不可变',对象/数组的内部属性/元素可以修改。
// 用户信息对象
const userInfo = { name: 'User', class: 'Class 24', hobby: ['唱歌', '跳舞'] };
userInfo.name = 'New Name';
userInfo.hobby.push('爬山');

// 列表数据
const list = ['苹果', '香蕉'];
list.push('橙子');
  • 声明 DOM 元素:创建后只会修改文本/样式,不会重新赋值成另一个元素。
const h2 = document.createElement('h2');
h2.textContent = '个人信息';
document.body.appendChild(h2);

const btn = document.createElement('button');
btn.textContent = '点击';
document.body.appendChild(btn);

2. let 的使用场景

只有当你需要'修改变量的值/引用'时,才用 let:

  • 循环变量:for/while 循环中的计数器。
const info = ['班级', '学号', '姓名'];
for (let i = 0; i < info.length; i++) {
    const p = document.createElement('p');
    p.textContent = info[i];
    document.body.appendChild(p);
}

let count = 0;
while (count < 3) {
    console.log('计数:', count);
    count++;
}
  • 状态变量:开关状态、计数器、表单输入值等。
let isShow = false;
const btn = document.createElement('button');
btn.textContent = '显示/隐藏';
btn.onclick = function() {
    isShow = !isShow;
    console.log('状态:', isShow);
};
document.body.appendChild(btn);

let num = 0;
const countBtn = document.createElement('button');
countBtn.textContent = '计数';
countBtn.onclick = function() {
    num++;
    countBtn.textContent = `计数:${num}`;
};
document.body.appendChild(countBtn);
  • 临时变量:分步计算的值、条件判断后需要修改的变量。
let total = 0;
total += 10;
total *= 0.8;
console.log('总价:', total);

let message;
const isLogin = false;
if (isLogin) {
    message = '欢迎登录';
} else {
    message = '请先登录';
}

五、避坑提醒

  1. ❌ 错误:用 const 声明需要修改的变量
const i = 0;
i++; // 报错:Assignment to constant variable.
  1. ❌ 错误:没必要用 let 声明不修改的变量
// 标题文本不会改,应该用 const 而不是 let
let TITLE = '个人信息'; // 应改为 const

六、总结

  1. 优先用 const:所有不需要重新赋值的场景,用 const 能让代码更安全、语义更清晰。
  2. 仅用 let:只有当变量需要重新赋值时,才用 let。
  3. 核心原则:能不用 let 就不用,用 const 约束'不变',用 let 表示'可变',彻底抛弃 var。

目录

  1. JavaScript 中 var、let、const 的核心区别与实战应用
  2. 一、核心概念铺垫
  3. 二、逐个拆解与对比
  4. 1. var(ES5 语法)
  5. 2. let(ES6 语法)
  6. 3. const(ES6 语法)
  7. 三、核心区别对比表
  8. 四、实际开发中的使用建议
  9. 1. const 的使用场景
  10. 2. let 的使用场景
  11. 五、避坑提醒
  12. 六、总结
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • 在昇腾 A2 上部署 Pi0 机器人模型:实测性能与踩坑记录
  • WebSocket 核心原理与前后端实战用法详解
  • AI 大模型的三大核心应用场景解析
  • TRAE 与 VSCode 中的 Git 分支管理与协作流程
  • AI 绘画报错:模型缺失与配置修复指南
  • AI 生成表格导出指南:三种技术路径与代码实现
  • AI 大模型通信机制解析:流式传输与数据封装逻辑
  • C++ 哈希表底层原理与实战实现详解
  • 基于YOLO与LLM的Web目标检测及人脸表情识别系统
  • OpenClaw 接入 QQ 机器人配置指南
  • AI 双重突破:MWC IQ 时代与 DeepSeek V4 多模态革命
  • AI 测试技术详解:自动化框架、缺陷检测与 A/B 测试优化
  • 从 ROPE 到 Yarn:通用公式解析长文本大模型的位置编码
  • Faster Whisper v1.7 本地语音转录与字幕生成教程(含 AMD 支持)
  • Sam Altman:超级人工智能将在几年后诞生
  • C++ 异常处理:理论、栈展开与最佳实践
  • Python Pandas Index 常用方法用法精讲
  • Python 入门实战:Windows 环境下 Python 下载、安装及环境配置详解
  • 鸿蒙电商购物车全栈项目:订单管理、支付管理与 AI 原生功能实现
  • Python 数据分析入门:集中趋势与离散程度

相关免费在线工具

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online