JavaScript 基础核心:变量、常量与内存模型
一、常量与字面量
在 JavaScript 中,常量(也称为字面量)代表不可更改的固定值。它们是代码中最基础的数据单元。
1.1 字面量分类
- 数值字面量:包括整数和浮点数。例如:
8080,0.5。 - 字符串字面量:由单引号、双引号或反引号包裹的文本。例如:
'Hello',"World"。 - 布尔字面量:逻辑值
true和false。
1.2 自定义常量 (ES6+)
使用 const 关键字声明的标识符为自定义常量,一旦初始化,其引用地址不可变更。
const SERVER_PORT = 3000;
// SERVER_PORT = 4000; // 此时会抛出 TypeError: Assignment to constant variable
二、变量的声明与管理
变量是程序在内存中申请的一块存储空间,用于存放可变的数据。开发者通过变量名来访问或修改其中的内容。
2.1 声明方式演进
JavaScript 提供了三种主要的声明方式:
- var(传统方式):存在变量提升(Hoisting)现象,允许重复声明,作用域为函数级或全局。
- let(现代方式):块级作用域,不存在变量提升,禁止在同一作用域内重复声明。
- const(常量声明):块级作用域,声明时必须赋值,且后续不可重新赋值。
// 变量初始化与修改
let currentSpeed = 60;
currentSpeed = 85;
// 批量声明
let x = 1, y = 2, z = 3;
// 链式赋值(需注意变量作用域风险)
let a, b;
a = b = 100;
2.2 声明的状态细节
- 只声明未赋值:变量的默认值为
undefined。 - 隐式全局声明:不使用关键词直接赋值(如
globalVar = 1),该变量会被挂载到全局对象(如window),但在严格模式下会报错,不推荐使用。
三、标识符命名规范
标识符是指开发者定义的变量名、函数名、属性名等。在 JavaScript 中,标识符必须遵循以下规则:
- 组成字符:必须由字母、数字、下划线 (
_) 或美元符号 ($) 组成。 - 首字符限制:严禁以数字开头。
- 大小写敏感:
UserRole与userRole是两个完全不同的标识符。 - 排除关键字:不能使用
if,while,class等系统关键字。 - 推荐风格:通用做法是使用小驼峰命名法(lowerCamelCase),例如
requestData、isUserLoggedIn。
四、关键字与保留字
关键字是语言本身预留并具有特殊功能的单词,如 export, import, async, await, instanceof 等。保留字则是目前尚未使用但未来可能被定义为关键字的单词,如 enum, public, interface 等。在编码时应完全避开这些单词作为标识符。
五、数据类型与内存机制
JavaScript 是一种动态类型语言,变量的具体类型在运行时由其存储的值决定。
5.1 数据类型分类
| 分类 | 包含类型 |
|---|---|
| 基本数据类型(值类型) | String, Number, Boolean, Undefined, Null, Symbol, BigInt |
| 引用数据类型 | Object (包含 Array, Function, Date, RegExp 等) |
5.2 内存布局:栈(Stack)与堆(Heap)
理解数据的存储机制对于避免代码逻辑错误至关重要:
- 栈内存:存放基本数据类型。它们占据固定大小的空间,赋值时是值拷贝。
- 堆内存:存放引用数据类型(对象)。变量在栈中存储的是指向堆中实际数据的内存地址(引用)。
// 情况 A:基本类型
let score1 = 90;
let score2 = score1;
score1 = 100;
console.log(score2); // 输出 90,不受 score1 影响
// 情况 B:引用类型
let user1 = { id: 101, name: 'Alice' };
let user2 = user1; // 拷贝的是内存地址
user2.name = 'Bob';
console.log(user1.name); // 输出 'Bob',因为两者指向堆中同一个对象