JavaScript中的const关键字有什么作用?如何使用?

JavaScript中的const关键字有什么作用?如何使用?
最新回答
╰未成年的花朵

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的使用方法
  • 基本类型的使用直接赋值基本类型值,后续不可修改:

    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']; // 报错:不能重新赋值
如何避免const对象被修改
  • 使用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、var的区别
  • 作用域

    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; // 允许
使用建议
  • 默认使用const除非变量需要重新赋值(如循环计数器),否则优先使用const以提高代码可读性和防止意外修改。
  • 避免使用varvar的作用域和提升行为易导致bug,现代JavaScript开发中应优先使用const/let。
  • 合理选择let仅在需要重新赋值时使用let(如循环变量、需要更新的状态值)。
const的性能影响
  • 理论优化const明确变量不可变,理论上有助于引擎优化(如常量折叠、死代码消除)。
  • 实际差异极小实际开发中,const与let的性能差异通常可忽略,代码可读性和可维护性更为重要。