在JavaScript中const 的重复声明规则与 let 类似,但更为严格, 默认情况下不允许重复声明 。唯一的「例外情况」同样是在 不同作用域 中的变量遮蔽。下面详细解释:

一、const的核心规则:同一作用域内禁止重复声明

根据ES6规范 const 声明的常量具有「 不允许同一作用域内重复声明 」的特性,具体表现为:

  • 同一代码块内 :不能用 const 重复声明已存在的变量(无论之前是用 const,let 还是 var 声明的)。

  • 函数作用域内 :不能用 const 重复声明函数作用域内已存在的变量。

违反此规则会直接抛出 SyntaxError 错误 (语法错误,在代码解析阶段就会报错,不会执行)。

示例1:同一代码块内重复声明

{  
  const a = 10;  
  const a = 20; // 语法错误:SyntaxError: Identifier 'a' has already been declared  
}

示例2:与let/var在同一作用域重复声明

{  
  let b = 10;  
  const b = 20; // 语法错误:SyntaxError: Identifier 'b' has already been declared  
}

{  
  var c = 10;  
  const c = 20; // 语法错误:SyntaxError: Identifier 'c' has already been declared  
}

二、const允许「重复声明」的唯一情况:不同作用域的变量遮蔽

const 常量 只有在不同作用域中 才可以声明同名变量,这种情况同样被称为「 变量遮蔽 」(Variable Shadowing)。此时,内层作用域的常量会「遮蔽」外层作用域的同名常量,但它们本质上是两个独立的常量。

示例3:不同作用域的同名const常量

// 外层作用域声明const常量
const x = 100;

function test() {
  // 内层作用域可以声明同名的const常量(这不是重复声明,而是创建了新常量)
  const x = 200;
  console.log(x); // 输出:200(访问的是内层常量)
}

test();
console.log(x); // 输出:100(访问的是外层常量)

示例4:代码块内的变量遮蔽

const y = 300;

if (true) {
  const y = 400; // 内层块级作用域的y,遮蔽外层的y
  console.log(y); // 输出:400
}

console.log(y); // 输出:300(外层的y不受影响)

三、const的额外特性:不可重新赋值与必须初始化

需要注意的是 const 与 let 还有一个关键区别 const 声明的变量 必须在声明时初始化 ,并且 后续不能重新赋值 (但对于引用类型,其内部属性可以修改)。这一特性与重复声明是独立的概念。

示例5:const必须初始化


const z; // 语法错误:SyntaxError: Missing initializer in const declaration

示例6:const不能重新赋值

const PI = 3.14159;
PI = 3.14; // 类型错误:TypeError: Assignment to constant variable.

总结

const 常量 只有在不同作用域中 可以声明同名变量(变量遮蔽),而在 同一作用域内永远不允许重复声明 (会直接抛出语法错误)。此外const 还要求声明时必须初始化且后续不能重新赋值,这些特性共同确保了 const 的「常量」语义,比 let 更为严格。