2021-12-30 18:38:01
const关键字用于声明常量,作用包括不可重新赋值(基本类型)、绑定变量名与内存地址(引用类型)、块级作用域等,使用时需初始化且避免重新赋值,对象属性可修改但可通过Object.freeze()限制。
const的作用不可重新赋值使用const声明的变量(基本类型如数字、字符串等)一旦赋值后,不能被重新赋值,否则会抛出TypeError。例如:
const PI = 3.14;PI = 3.1415; // 报错:Assignment to constant variable.绑定变量名与内存地址(引用类型)对于对象或数组等引用类型,const保证变量名与内存地址的绑定关系不可变,但对象内部的属性或数组元素可以修改。例如:
const myArray = [1, 2, 3];myArray.push(4); // 允许修改数组元素console.log(myArray); // 输出 [1, 2, 3, 4]// myArray = [5, 6]; // 报错:不能重新赋值块级作用域const声明的变量作用域与let相同,均为块级作用域(如if、for、函数等代码块内有效),而非函数作用域(var的特性)。例如:
if (true) { const blockVar = 'block'; console.log(blockVar); // 输出 'block'}// console.log(blockVar); // 报错:blockVar未定义必须初始化const声明常量时必须立即初始化,否则会报语法错误。例如:
const uninitializedVar; // 报错:Missing initializer in const declaration基本类型的使用直接赋值基本类型值,后续不可修改:
const MAX_USERS = 100;// MAX_USERS = 200; // 报错对象的使用对象属性可修改,但对象本身不可重新赋值:
const user = { name: 'Alice', age: 25 };user.age = 26; // 允许修改属性console.log(user.age); // 输出 26// user = { name: 'Bob' }; // 报错:不能重新赋值数组的使用数组元素可修改,但数组本身不可重新赋值:
const colors = ['red', 'green'];colors.push('blue'); // 允许添加元素console.log(colors); // 输出 ['red', 'green', 'blue']// colors = ['yellow']; // 报错:不能重新赋值使用Object.freeze()通过Object.freeze()可冻结对象,使其属性不可修改、添加或删除(浅冻结,嵌套对象不受影响):
const frozenUser = Object.freeze({ name: 'Alice', age: 25 });frozenUser.age = 26; // 静默失败(严格模式下报错)console.log(frozenUser.age); // 输出 25深度冻结若需完全不可变,需递归冻结所有嵌套对象:
function deepFreeze(obj) { Object.freeze(obj); Object.keys(obj).forEach(key => { if (typeof obj[key] === 'object' && obj[key] !== null) { deepFreeze(obj[key]); } }); return obj;}const deeplyFrozen = deepFreeze({ a: { b: 1 } });deeplyFrozen.a.b = 2; // 静默失败console.log(deeplyFrozen.a.b); // 输出 1作用域
const/let:块级作用域(如if、for块内有效)。
var:函数作用域(整个函数内有效)。
if (true) { let blockLet = 'let'; var funcVar = 'var';}console.log(funcVar); // 输出 'var'// console.log(blockLet); // 报错:blockLet未定义重复声明
const/let:同一作用域内不可重复声明同名变量。
var:允许重复声明。
let x = 1;// let x = 2; // 报错:Identifier 'x' has already been declaredvar y = 1;var y = 2; // 允许变量提升
const/let:不会变量提升,声明前使用会报错(暂时性死区)。
var:会变量提升,声明前使用值为undefined。
console.log(a); // 输出 undefinedvar a = 1;console.log(b); // 报错:Cannot access 'b' before initializationlet b = 2;可修改性
const:基本类型不可修改,引用类型属性可修改。
let/var:变量值可自由修改。
const c = 1;// c = 2; // 报错let d = 1;d = 2; // 允许