阿里云主机折上折
  • 微信号
您当前的位置:网站首页 > const关键字与常量声明

const关键字与常量声明

作者:陈川 阅读数:65516人阅读 分类: JavaScript

const关键字的基本概念

const是ECMAScript 6引入的声明变量的关键字,用于创建块级作用域的常量。与var和let不同,const声明的变量必须在声明时初始化,且不能重新赋值。这种特性使得const成为声明程序中不应改变的值的理想选择。

const PI = 3.14159;
console.log(PI); // 3.14159

PI = 3.14; // TypeError: Assignment to constant variable

const的块级作用域特性

const与let一样具有块级作用域,这意味着const声明的常量只在声明它的代码块内有效。这与var的函数作用域形成鲜明对比。

{
  const localConst = "只在块内有效";
  console.log(localConst); // "只在块内有效"
}
console.log(localConst); // ReferenceError: localConst is not defined

const与对象和数组

虽然const声明的变量不能重新赋值,但对于对象和数组这样的复合类型,其属性或元素是可以修改的。这是因为const保证的是变量绑定的内存地址不变,而不是该地址的数据不变。

const person = {
  name: "Alice"
};
person.name = "Bob"; // 允许修改属性
console.log(person.name); // "Bob"

person = {}; // TypeError: Assignment to constant variable

const numbers = [1, 2, 3];
numbers.push(4); // 允许修改数组
console.log(numbers); // [1, 2, 3, 4]

const与暂时性死区

const与let一样存在暂时性死区(Temporal Dead Zone, TDZ)现象。在声明之前访问const变量会抛出ReferenceError,这与var的变量提升行为不同。

console.log(a); // ReferenceError: Cannot access 'a' before initialization
const a = 10;

const的最佳实践

在实际开发中,const应该成为默认的变量声明方式,只有在确实需要重新赋值时才使用let。这种做法可以提高代码的可读性和可维护性。

  1. 对于基本类型的常量值使用const
  2. 对于不会重新赋值的对象和数组使用const
  3. 使用大写字母和下划线命名真正的常量(如配置值)
const MAX_ITEMS = 100;
const API_URL = "https://api.example.com";
const DEFAULT_CONFIG = {
  timeout: 5000,
  retry: 3
};

const在循环中的应用

在for...of和for...in循环中,const可以用于声明循环变量,每次迭代都会创建一个新的绑定。

const arr = [1, 2, 3];
for (const item of arr) {
  console.log(item); // 1, 2, 3
}

const obj = {a: 1, b: 2};
for (const key in obj) {
  console.log(key); // "a", "b"
}

const与模块导入

在ES6模块系统中,import语句的行为类似于const声明,导入的绑定不能被重新赋值。

// module.js
export const name = "Module";

// main.js
import { name } from './module.js';
console.log(name); // "Module"
name = "New Name"; // TypeError: Assignment to constant variable

const与冻结对象

为了创建真正不可变的对象,可以结合Object.freeze()方法使用const。这会阻止对象属性的添加、删除或修改。

const frozenObj = Object.freeze({
  prop: "value"
});

frozenObj.prop = "new value"; // 静默失败或TypeError(严格模式)
console.log(frozenObj.prop); // "value"

const与全局对象

在全局作用域中使用const声明的变量不会成为window对象的属性,这与var不同。

var globalVar = "I'm global";
const globalConst = "I'm also global";

console.log(window.globalVar); // "I'm global"
console.log(window.globalConst); // undefined

const的性能考量

从性能角度看,使用const可能带来微小的优化机会。JavaScript引擎可以对const变量做出更多假设,从而可能生成更高效的代码。虽然这种优化通常微不足道,但也是使用const的一个额外好处。

const与TypeScript

在TypeScript中,const除了保持ES6的特性外,还有特殊的类型推断行为。使用const声明的字面量类型会被推断为最窄的可能类型。

const str = "hello"; // 类型为"hello",而不是string
const num = 42; // 类型为42,而不是number

const的浏览器兼容性

现代浏览器普遍支持const关键字,但在旧版浏览器中可能需要转译工具如Babel的支持。可以通过特性检测来确认const是否可用。

try {
  const test = true;
  console.log("const is supported");
} catch (e) {
  console.log("const is not supported");
}

本站部分内容来自互联网,一切版权均归源网站或源作者所有。

如果侵犯了你的权益请来信告知我们删除。邮箱:cc@cccx.cn

前端川

前端川,陈川的代码茶馆🍵,专治各种不服的Bug退散符💻,日常贩卖秃头警告级的开发心得🛠️,附赠一行代码笑十年的摸鱼宝典🐟,偶尔掉落咖啡杯里泡开的像素级浪漫☕。‌