不能对const定义的变量本身重新赋值,但是可以通过其他方式更换变量里面的属性或元素(仅限对象类型和数组类型)。
“不能对const定义的变量本身重新赋值”
这指的是 const 创建了一个只读的绑定(read-only binding)。变量名和它所指向的内存地址之间的这个链接关系是不可更改的。
“但是可以通过其他方式更换变量里面的属性或元素(仅限对象类型和数组类型)”
这指的是 const 并不关心那个内存地址上存放的数据内容。对于对象和数组(这两种都属于“引用类型”),变量里存的仅仅是一个地址。const 保证地址不变,但该地址上的那个对象或数组,其内部是可以自由修改(mutate)的。
我们将类型分为两大类:原始数据类型 和 引用数据类型,因为 const
对它们的行为模式有根本不同。
第一类:原始数据类型 (Primitive Types)
包括:Number, String, Boolean, null, undefined, Symbol, BigInt。
核心规则:对于原始类型,const 声明后,变量的值完全不可改变。任何试图重新赋值的行为都会报错。
1. 数字 (Number)
// --- 可行操作 ---
const age = 30;
console.log(age); // 30const price = 19.99;
const quantity = 3;
const total = price * quantity; // 使用 const 变量进行计算是完全可以的
console.log(total); // 59.97// --- 不可行操作 ---
const score = 100;
score = 99; // 错误!TypeError: Assignment to constant variable.
2. 字符串 (String)
// --- 可行操作 ---
const greeting = "你好";
const name = "世界";
const message = greeting + ", " + name + "!"; // 使用 const 变量创建新字符串
console.log(message); // "你好, 世界!"// --- 不可行操作 ---
const website = "google.com";
website = "bing.com"; // 错误!TypeError: Assignment to constant variable.
3. 布尔值 (Boolean)
// --- 可行操作 ---
const isLoggedIn = true;
if (isLoggedIn) {console.log("用户已登录");
}// --- 不可行操作 ---
const hasPermission = false;
hasPermission = true; // 错误!TypeError: Assignment to constant variable.
第二类:引用数据类型 (Reference Types)
主要包括:Object 和 Array。
核心规则:对于引用类型,const 只保证变量指向的内存地址不变。你不能让变量指向一个全新的对象或数组,但可以随意修改该对象或数组内部的内容。
1. 对象 (Object)
// --- 不可行操作 (重新赋值) ---
const person = {name: "张三",city: "北京"
};// 试图让 person 指向一个全新的内存地址(一个新对象)
person = { name: "李四", city: "上海" };
// 错误!TypeError: Assignment to constant variable.// --- 可行操作 (修改内容) ---
const car = {brand: "Toyota",year: 2022
};// 1. 修改属性
car.year = 2023;
console.log(car); // { brand: "Toyota", year: 2023 }// 2. 添加新属性
car.color = "blue";
console.log(car); // { brand: "Toyota", year: 2023, color: "blue" }// 3. 删除属性
delete car.brand;
console.log(car); // { year: 2023, color: "blue" }
2. 数组 (Array)
// --- 不可行操作 (重新赋值) ---
const numbers = [1, 2, 3];// 试图让 numbers 指向一个全新的内存地址(一个新数组)
numbers = [4, 5, 6];
// 错误!TypeError: Assignment to constant variable.// --- 可行操作 (修改内容) ---
const fruits = ["apple", "banana"];// 1. 添加一个元素
fruits.push("orange");
console.log(fruits); // ["apple", "banana", "orange"]// 2. 修改一个元素
fruits[0] = "cherry";
console.log(fruits); // ["cherry", "banana", "orange"]// 3. 删除一个元素
fruits.pop();
console.log(fruits); // ["cherry", "banana"]// 4. 清空数组(注意:这依然是在修改原数组,而不是重新赋值)
fruits.length = 0;
console.log(fruits); // []
总结表格
变量声明 | 数据类型 | 重新赋值 (= ) |
修改内容 (.prop 或 .push() ) |
const |
原始类型 | 不可行 ❌ | (不适用) |
const |
对象/数组 | 不可行 ❌ | 可行 ✅ |
let |
所有类型 | 可行 ✅ | 可行 ✅ |