const 和 let俩儿哥们

const 与 let 易错点

GJ504b最近要考web期末了,总结一下constlet

let:

暂时性死区

变量在声明前无法访问,用typeof也报错

console.log(num); // 报错:ReferenceError(num未声明)
let num = 10; 

块级作用域边界

let 声明的变量仅在当前代码块({} 包裹的区域)内有效,跨块访问会报错。

if (true) {
  let x = 10;
}
console.log(x); // 报错:x未定义

不可重复声明

同一作用域内,let 变量不能与 var、let、const 重复声明同名变量

let a = 10;
let a = 20; // 报错:标识符a已声明

const:

必须立即初始化

声明时必须赋值,否则报错

const PI; // 报错:未初始化
const PI = 3.14; // 正确

“不可变”的误解

  1. 基本类型:值不可变,重新赋值报错
const num = 10;
num = 20; // 报错:Assignment to constant variable
  1. 引用类型:变量储存地址不可变,对象/数组的内容可以修改
const obj = { name: '张三' };
obj.name = '李四'; // 允许(修改对象属性,地址未变)
obj = { name: '王五' }; // 报错(重新赋值,地址改变)

作用域重复声明

const 声明的变量仅在当前代码块({} 包裹的区域)内有效,跨块访问会报错。

if (true) {

  const x = 10;
}
console.log(x); // 报错:x未定义

和var区别

  1. let/const 声明的全局变量不属于 window 对象(var 声明的全局变量属于 window)
let a = 10;
console.log(window.a); // undefined(let声明)
var b = 20;
console.log(window.b); // 20(var声明)
  1. let 在 for 循环中为每次迭代创建独立作用域,var 则共享作用域(易引发闭包陷阱)。
for (let i = 0; i < 3; i++) {
  setTimeout(() => console.log(i), 0); // 输出 0,1,2(每次迭代独立i)
}
for (var j = 0; j < 3; j++) {
  setTimeout(() => console.log(j), 0); // 输出 3,3,3(共享j,最终值为3)
}
posted @ 2025-06-25 00:03  GJ504b  阅读(22)  评论(0)    收藏  举报