const不可改变解释

const不可改变解释

不能对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); // 30

const 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

所有类型

可行 ✅

可行 ✅

相关文章