const在全局上下文中创建块级、不可重新赋值的绑定,不挂载到全局对象;遵守tdz、禁止重复声明、支持对象内部修改但禁止重新赋值。

在全局执行上下文中,const 声明的行为有明确且不可绕过的规则:它创建一个**块级作用域的、不可重新赋值的绑定**,即使在全局层面,也不挂载到全局对象(如 window 或 global)上——这和 var 有本质区别。
1. 不具备全局对象属性特性
var 在全局作用域声明会成为全局对象的可配置属性(例如浏览器中 window.x = 1),而 const 不会:
-
var a = 1;→window.a存在且可读写 -
const b = 2;→window.b是undefined,无法通过window访问
2. 遵守块级作用域,哪怕在全局
全局执行上下文本身就是一个“隐式块”,const 在其中仍受块级作用域约束:
- 不能在声明前访问(进入暂时性死区 TDZ),会抛出
ReferenceError - 同一作用域内重复声明同名
const直接报错:SyntaxError: Identifier 'xxx' has already been declared - 在
if、for等块内声明的const,仅在该块内有效,外部不可见
3. 值不可变 ≠ 对象不可变
全局 const 声明后,变量绑定的内存地址不可更改,但若值是对象或数组,其内部属性/元素仍可修改:
-
const obj = { x: 1 };→obj.x = 2✅ 允许 -
obj = {};❌ 报错:TypeError: Assignment to constant variable -
const arr = [1];→arr.push(2)✅ 允许;arr = []❌ 不允许
4. 无变量提升(但有声明提升)
const 的声明会被“提升”到块顶部,但不初始化,整个从块开始到声明语句之间的区域都是 TDZ:
-
console.log(c); const c = 3;→ 报错,不是undefined - 这与
var的“声明+初始化为undefined”提升完全不同











