news 2026/4/17 17:17:11

JavaScript 中的 let、var 和 const( 不能重新赋值 < 但对象/数组内容可修改 > )

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
JavaScript 中的 let、var 和 const( 不能重新赋值 < 但对象/数组内容可修改 > )

JavaScript 中letvarconst的主要区别总结:

特性varletconst
作用域函数作用域(function-scoped)块级作用域(block-scoped)块级作用域(block-scoped)
变量提升(Hoisting)是(提升至函数顶部,初始值为undefined是(提升但不初始化,处于“暂时性死区”)是(提升但不初始化,处于“暂时性死区”)
可重复声明允许在同一作用域内重复声明不允许在同一块作用域内重复声明不允许在同一块作用域内重复声明
可重新赋值✅ 可以重新赋值✅ 可以重新赋值❌ 不能重新赋值(但对象/数组内容可修改)
初始化要求可不初始化(默认undefined可不初始化必须在声明时初始化
全局对象属性在全局作用域中声明会挂载到window(浏览器)或global(Node.js)不会挂载到全局对象不会挂载到全局对象
适用场景旧代码兼容(不推荐新项目使用)需要重新赋值的变量声明后值不变的常量(如配置、API 地址等)

补充说明:

  • “暂时性死区”(Temporal Dead Zone, TDZ):在块级作用域内,letconst声明的变量在声明前不可访问,否则会抛出ReferenceError
  • const的“不可变”是引用不可变:对于对象或数组,虽然不能重新赋值,但可以修改其内部属性或元素。

Js

const obj = { a: 1 }; obj.a = 2; // ✅ 合法 obj = {}; // ❌ 报错:Assignment to constant variable.

最佳实践:优先使用const,需要重新赋值时用let,避免使用var


const不能重新赋值(但对象/数组内容可修改)


在 JavaScript 中,const声明的变量不能重新赋值,但对象或数组的内容可以被修改。这看似矛盾,其实源于 JavaScript 中值类型(primitive)和引用类型(reference)的区别。


一、核心原理:const保证的是“绑定不变”,不是“值不变”

  • const的含义是:变量标识符与内存地址的绑定是常量
  • 对于基本类型(如 number、string、boolean 等),值直接存储在变量中,因此值不可变。
  • 对于引用类型(如 object、array、function),变量存储的是指向堆内存中对象的引用(地址)const只保证这个引用地址不变,但不阻止你修改该地址所指向的对象内容

二、示例对比

✅ 基本类型(不可变)

const x = 10; x = 20; // ❌ TypeError: Assignment to constant variable.

因为x直接保存值10,重新赋值会改变绑定,违反const规则。


✅ 引用类型(引用不可变,内容可变)

const user = { name: "Alice" }; user.name = "Bob"; // ✅ 合法:修改对象属性 user.age = 30; // ✅ 合法:添加新属性 // user 仍然指向同一个对象,只是对象内部变了 user = { name: "Charlie" }; // ❌ TypeError: Assignment to constant variable.

这里user变量保存的是对象的引用地址。只要不把user指向另一个新对象(即不改变引用),就符合const的规则。


数组同理:

Js

const colors = ["red", "green"]; colors.push("blue"); // ✅ 合法:修改数组内容 colors[0] = "yellow"; // ✅ 合法 colors = ["black"]; // ❌ 报错:试图重新赋值整个变量

三、如何让对象真正“不可变”?

如果希望对象内容也不能被修改,可以使用Object.freeze()

const user = Object.freeze({ name: "Alice" }); user.name = "Bob"; // 在严格模式下会报错;非严格模式下静默失败(无效果)

注意:Object.freeze()是浅冻结,嵌套对象仍可能被修改。如需深度冻结,需递归实现。


四、总结

类型const行为
基本类型值完全不可变
引用类型引用地址不可变,但对象/数组内部可变

💡记住:const≠ “不可变数据”,而是“不可重新赋值的变量”。
若需要真正的不可变性,应结合Object.freeze()或使用不可变数据库(如 Immutable.js)。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/17 3:29:39

**基于MB-TaylorFormer高分辨率特征提取的YOLOv11改进实战指南**

购买即可解锁300+YOLO优化文章,并且还有海量深度学习复现项目,价格仅需两杯奶茶的钱,别人有的本专栏也有! 文章目录 **基于MB-TaylorFormer高分辨率特征提取的YOLOv11改进实战指南** **一、高分辨率特征提取的技术瓶颈分析** **二、MB-TaylorFormer核心架构解析** **三、Y…

作者头像 李华
网站建设 2026/4/17 9:15:24

Unity 之 物理引擎中三种刚体力施加方式详解

Unity 之 物理引擎中三种刚体力施加方式详解1. 概述2. 核心概念对比3. 方式一:直接设置速度 (velocity v3)3.1 原理3.2 关键特性3.3 使用场景与示例3.4 注意事项4. 方式二:施加力 (AddForce)4.1 原理4.2 ForceMode 详解4.3 使用场景与示例5. 方式三&…

作者头像 李华
网站建设 2026/4/17 18:01:42

51、版本控制系统与文档管理综合指南

版本控制系统与文档管理综合指南 在软件开发和文档管理过程中,版本控制是一项至关重要的工作。它能够帮助我们记录文件的变更历史,方便团队协作和项目管理。本文将详细介绍几种常见的版本控制系统,包括CVS、Subversion、RCS,同时也会提及一些文字处理器的版本管理功能,以…

作者头像 李华
网站建设 2026/4/18 4:28:30

RTP协议中RFC 3550 与 RFC 3551 的关系

RFC 3551 是 RFC 3550 的直接补充和具体化文档,它们构成了RTP协议的核心标准对。 其中RFC 3550是RTP整体协议族的框架规范,RFC 3551是RTP协议的具体实现标准,开发中两者都需要参考。 RFC 3550 与 RFC 3551 的关系 ┌────────────…

作者头像 李华
网站建设 2026/4/18 4:31:32

一文详解GraphRAG:如何将复杂查询准确率从43%提升至91%的工程实践!

简介 文章分析了传统向量RAG在多跳推理、实体消歧和主题级问题上的三大缺陷,详细介绍了GraphRAG的三层核心技术架构:实体解析层、关系提取与图构建层、社区发现与层次化总结层。通过生产环境实践,展示了GraphRAG如何将复杂查询准确率从43%提升…

作者头像 李华
网站建设 2026/4/18 4:24:39

AI赋能测试:效率跃迁的实践路径

在软件测试领域,传统手动测试模式正面临效率瓶颈。测试人员常深陷重复劳动、覆盖率不足与维护成本攀升的困境,尤其在敏捷开发节奏下,手动测试的局限性愈发凸显。AI技术的引入,为手动测试注入了革命性活力,通过智能辅助…

作者头像 李华