js const(建议收藏)
💡一则或许对你有用的小广告
欢迎加入小哈的星球 ,你将获得:专属的项目实战(已更新的所有项目都能学习) / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论
- 新开坑项目:《Spring AI 项目实战》 正在持续爆肝中,基于 Spring AI + Spring Boot 3.x + JDK 21..., 点击查看 ;
- 《从零手撸:仿小红书(微服务架构)》 已完结,基于
Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...
,点击查看项目介绍 ;演示链接: http://116.62.199.48:7070 ;- 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;
截止目前, 星球 内专栏累计输出 90w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 3100+ 小伙伴加入学习 ,欢迎点击围观
在 JavaScript 开发中,变量声明是构建程序逻辑的基础操作。随着 ES6 的普及,const
已成为现代代码中高频出现的关键词之一。对于编程初学者而言,理解 const
的特性与使用场景,不仅能提升代码的可维护性,还能避免因变量意外修改引发的逻辑错误。本文将从基础概念出发,结合实际案例与对比分析,深入解析 js const
的核心知识点,帮助开发者逐步掌握这一工具的正确使用方法。
什么是 const?
const
是 JavaScript 中用于声明常量的关键字,其英文含义为“constant”,即“不变的”。通过 const
声明的变量,在初始化后无法被重新赋值,这类似于给变量加上了一层“不可变性”的保护。
基础语法与特性
// 声明一个常量
const PI = 3.1415926;
// 尝试重新赋值会抛出错误
PI = 3.14; // 报错:Assignment to constant variable.
关键特性总结:
特性 | 描述 |
---|---|
不可重新赋值 | 声明后无法修改变量的值,但对象或数组的属性/元素可修改。 |
必须初始化 | 声明时必须立即赋值,否则会抛出错误。 |
块级作用域 | 作用域仅限于声明它的块(如 {} 包裹的代码块)或函数内部。 |
形象比喻:const 是“不可变的保险箱”
可以将 const
视为一个“保险箱”:一旦放入值后,这个箱子的锁就无法打开,但箱内的物品(如对象或数组)可能仍可被修改。例如:
const config = { theme: 'dark' };
// 修改对象属性(允许)
config.theme = 'light';
// 重新赋值整个对象(禁止)
config = { theme: 'auto' }; // 报错
const 与 var/let 的对比
在 ES6 之前,JavaScript 主要使用 var
声明变量,而 let
和 const
的引入,弥补了 var
的作用域缺陷。以下是三者的对比:
核心差异表格
(表格前空一行)
| 关键字 | 作用域 | 是否可重新赋值 | 是否必须初始化 | 变量提升行为 |
|--------|-------------|---------------|---------------|-------------------|
| var
| 函数作用域 | 允许 | 不需要 | 存在(变量声明提升,值初始化为 undefined
) |
| let
| 块级作用域 | 允许 | 必须 | 存在(声明提升,但值不可用) |
| const
| 块级作用域 | 禁止 | 必须 | 存在(同 let
) |
实战案例:变量提升与作用域
// 案例 1:var 的变量提升
console.log(x); // 输出:undefined
var x = 10;
// 案例 2:let 和 const 的暂时性死区
console.log(y); // 报错:ReferenceError
let y = 20;
console.log(z); // 报错:ReferenceError
const z = 30;
对比总结
- 作用域:
const
和let
均为块级作用域,避免了var
的函数作用域导致的意外覆盖。 - 可变性:
const
强制不可变性,适合声明无需修改的值(如配置、数学常量)。 - 初始化:
const
和let
必须立即初始化,而var
允许延迟赋值。
const 的典型应用场景
案例 1:声明不可变的常量
// 数学常量
const EULER_NUMBER = 2.71828;
// 配置对象
const API_ENDPOINT = 'https://api.example.com/v1/';
案例 2:避免意外覆盖全局变量
// 使用 const 避免意外覆盖全局变量
const DEFAULT_COLOR = '#000000';
function setColor(userColor) {
const color = userColor || DEFAULT_COLOR;
// ...后续逻辑
}
案例 3:与对象/数组的配合使用
// 宣告对象的不可变性,但属性仍可修改
const user = { name: 'Alice' };
user.name = 'Bob'; // 允许
user = { name: 'Charlie' }; // 报错
// 数组元素的修改示例
const numbers = [1, 2, 3];
numbers.push(4); // 允许
numbers = [5, 6]; // 报错
注意:对象/数组的“部分可变性”
虽然 const
禁止重新赋值变量本身,但若变量指向的是对象或数组,其内部属性或元素仍可修改。这需要开发者通过其他方式(如 Object.freeze()
)确保深层不可变性。
常见误区与解决方案
误区 1:将 const 视为“完全不可变”
const fruits = ['apple', 'banana'];
fruits[0] = 'orange'; // 允许,数组元素可修改
// 但 fruits = ['mango'] 将报错
解决方案:若需完全冻结对象或数组,可使用 Object.freeze()
:
const fruits = Object.freeze(['apple', 'banana']);
fruits.push('orange'); // 报错:Cannot add property 2, object is not extensible
误区 2:在循环中误用 const
for (const i = 0; i < 5; i++) { // 报错:Assignment to constant variable.
// ...
}
正确写法:使用 let
声明循环变量:
for (let i = 0; i < 5; i++) {
// ...
}
误区 3:忽略块级作用域的影响
if (true) {
const message = 'Hello!';
console.log(message); // 输出:Hello!
}
console.log(message); // 报错:message is not defined
关键点:const
声明的变量仅在块级作用域内有效,外部无法访问。
进阶技巧与最佳实践
技巧 1:命名规范
常量名通常使用全大写,单词间用下划线分隔:
const MAX_ATTEMPTS = 3;
const USER_AGENT = navigator.userAgent;
技巧 2:与模块导出结合
在模块中声明常量,确保全局唯一性:
// config.js
export const THEME = 'dark';
export const TIMEOUT = 5000;
// main.js
import { THEME, TIMEOUT } from './config.js';
技巧 3:避免空声明
const
必须初始化,否则会报错:
const EMPTY; // 报错:Missing initializer in const declaration
解决方案:初始化为默认值:
const EMPTY = null;
性能与代码质量优化
场景 1:减少意外覆盖风险
使用 const
可避免因变量被意外修改导致的逻辑漏洞,尤其在团队协作开发中,这一特性能显著降低调试成本。
场景 2:提升代码可读性
通过 const
声明的变量,向其他开发者明确传递“此值不可变”的信号,例如:
// 明确表示 URL 不会改变
const BASE_URL = 'https://api.example.com/';
场景 3:与严格模式结合
在严格模式下('use strict';
),JavaScript 会更严格地检查变量使用,与 const
联合使用可进一步保障代码健壮性。
结论
js const
是现代 JavaScript 开发中不可或缺的工具,它通过强制不可变性和块级作用域,帮助开发者编写更安全、可维护的代码。无论是声明数学常量、配置对象,还是避免变量污染,const
都展现了其独特价值。
然而,理解其“部分不可变性”和作用域规则同样关键。通过结合 Object.freeze()
、命名规范和模块化设计,开发者能最大化 const
的优势,同时规避常见陷阱。随着实践的深入,const
将成为构建健壮 JavaScript 应用的基础之一。
拓展思考:ES6 引入的
let
和const
重构了 JavaScript 的变量管理逻辑,后续可进一步探索let
的动态特性,以及var
在历史遗留代码中的兼容处理策略。