const关键字与常量声明
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。这种做法可以提高代码的可读性和可维护性。
- 对于基本类型的常量值使用const
- 对于不会重新赋值的对象和数组使用const
- 使用大写字母和下划线命名真正的常量(如配置值)
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
上一篇:let关键字及其块级作用域
下一篇:暂时性死区(TDZ)概念