JavaScript 变量声明最佳实践

使用const 作为变量赋值,这是一个非常好的习惯!在现代前端开发(尤其是 Vue/React 项目)中,"默认使用 const,只有必须修改时才用 let" 是公认的最佳实践。

不仅没有问题,反而是在遵循行业标准。

不过,作为一个开发者,我们需要深入理解 const 到底锁住了什么 ,否则在处理**对象(Object)和数组(Array)**时可能会产生误解。

以下是关于 const 你必须知道的几个核心点:

1. 最大的误区:const 并不代表"值不能变"

很多初学者认为 const 定义的东西就是"常量",永远不能改。这是不准确的。

  • 对于基础类型(String, Number, Boolean):是的,你不能修改它的值。
  • 对于引用类型 (Object, Array):const 锁住的只是内存地址(引用),而不是里面的内容。

代码演示:

javascript 复制代码
// ✅ 基础类型:彻底锁死
const score = 100;
score = 101; // ❌ 报错:Assignment to constant variable.

// ⚠️ 引用类型:锁地址,不锁内容
const user = { name: "Ming", age: 18 };

// ✅ 这样是允许的!(修改内容)
user.age = 19; 
console.log(user.age); // 19

// ✅ 这样也是允许的!(新增属性)
user.gender = "male";

// ❌ 这样是禁止的!(修改地址/重新赋值)
user = { name: "Jack" }; // 报错

比喻:
const 就像是你给了变量一个房子的地址。

  • 你不能把这个变量指向另一个房子(重新赋值)。
  • 但是你可以随意装修这个房子里的家具(修改属性)。

2. Vue 3 中的 const

在你之前的 Vue 代码中,你可能会疑惑:为什么响应式数据要用 const?

javascript 复制代码
// Vue 3 常见写法
const count = ref(0);
const state = reactive({ list: [] });
  • 为什么 ref 用 const?

  • 因为 ref 返回的是一个对象(RefImpl)。

  • 我们修改的是 count.value = 1(修改房子里的家具)。

  • 我们永远不会写 count = ref(1)(换房子),这样会丢失响应性。

  • 为什么 reactive 用 const?

  • 同理,reactive 返回的是一个 Proxy 对象。我们只修改里面的属性,不修改对象本身。

结论 :在 Vue 3 中,95% 的响应式变量定义都应该用 const。


3. 什么时候 const 会出问题?(必须用 let 的场景)

只有当你明确需要**"重新赋值"**(Reassign)的时候,const 才会报错,这时你需要换成 let。

场景 A:基本类型的累加/切换
javascript 复制代码
// ❌ 错误
const isShow = false;
isShow = true; // 报错

// ✅ 正确
let isShow = false;
isShow = true;
场景 B:for 循环的索引
javascript 复制代码
// ❌ 错误
for (const i = 0; i < 5; i++) { 
    // i++ 试图修改 i,导致报错
}

// ✅ 正确
for (let i = 0; i < 5; i++) { ... }

// ✅ 特例:for...of 是可以的
// 因为每次循环都会创建一个新的 const 作用域,而不是修改同一个变量
for (const item of list) { ... } 

4. 总结:黄金法则

  1. **首选 const**:默认所有变量都用 const。这能告诉阅读代码的人:"这个变量的引用不会变",代码可读性更强,也更安全。
  2. **次选 let**:如果你写代码时发现报错说 Assignment to constant variable,或者你明确知道这个变量稍后会被 x = y 这样重新赋值,再把它改成 let。
  3. **永不用 var**:把它扫进历史的垃圾堆。var 有变量提升(Hoisting)和作用域泄露的问题,是 bug 之源。

一句话:只要记住 const 对象是可以改属性的就行。

相关推荐
wjjzhbb24 分钟前
前端监控:给用户体验装上仪表盘
前端·ux
江湖有缘34 分钟前
Docker实战 | Docker部署Minimalist-web-notepad个人笔记本
前端·docker·notepad++
用户2986985301441 分钟前
在 React 中使用 JavaScript 将 Markdown 转换为 PDF
javascript·react.js·markdown
Hilaku1 小时前
为什么我在团队里禁止使用 axios?
前端·javascript·程序员
兮动人1 小时前
Chrome 152 升级后本地请求全挂了?是 LNA 策略在搞事
前端·chrome·lna·local network
一只游鱼1 小时前
我用原生 JS 做了一个「会呼吸」的博客:Canvas 水境 + 合成音效 + 会破裂的留言气泡(vibe coding)
javascript·agent·canvas·github pages
JarvanMo1 小时前
让 3D 在 Flutter 中焕发生机:Flutter GPU 与 flutter_scene 实战经验
前端
狂师2 小时前
太强了!GitHub上开源了一款AI自动化测试框架,0代码搞定前后端测试!
前端·后端·测试
只睡四小时2 小时前
Local-First 数据契约:一张表装下 4 类数据
前端·javascript·架构设计·local-first·数据契约
迅猛龙办公室2 小时前
Python函数实现反转一个只有3位数的整数
开发语言·前端·python