var let const 区别:
基本定义
-
varJavaScript 中用于声明变量的传统关键字,属于 ES5 及更早语法,声明的变量具有函数作用域。
-
letES6 新增的关键字,用于声明块级作用域的变量,变量可重新赋值,不能重复声明。
-
constES6 新增的关键字,用于声明块级作用域的常量,声明时必须赋值,且不能重新赋值,适合声明固定不变的数据。
为什么要引入let const?
要回答这个问题,大家先看以下代码
for (var i = 0; i < 3; i++) {
setTimeout(() => {
console.log(i); }, 100); }
if (true) {
var a = 10; }
console.log(a); // 10
首先回到第一段代码,输出的结果是 0,1,2 吗?
当然不会 输出结果为 3 3 3 ,为什么会这样?
原因:
- var 是函数作用域,不是块级作用域
- 循环里只有一个 i,三个定时器共用它
- 等定时器执行时,循环早已跑完,i 已经变成 3
这就是典型的变量丢失 / 共用问题。
再回到第二段代码:
正常逻辑:a 只在 if 里有效,外面应该访问不到。但 var 没有块级作用域,变量泄露到全局,造成污染。
为什么要引入let const ,因为它解决了var在for if中 变量丢失,变量泄露污染全局的问题。
作用域不同
var:函数作用域,没有块级作用域
代码从参考上述 1,2
let.const:块级作用域,{}内部有效
if (true) {
let b = 200; }
console.log(b); // Uncaught ReferenceError: b is not defined
看以下代码:
{ var x = 1;
let y = 2;
const z = 3; }
console.log(x); // 1(var 不受 {} 限制)
console.log(y); // 报错
console.log(z); // 报错
变量提升与暂时性死区
参考以下代码:
// var
console.log(a); // undefined
var a = 10;
// let
console.log(b); // 报错:Cannot access 'b' before initialization
let b = 20;
// const
console.log(c); // 报错
const c = 30;
可以一句话总结为:
-
var:提升 → 可访问,值为
undefined -
let / const:提升 → 不能访问,访问就报错 → 这就是暂时性死区
能否重新声明与赋值
// 1. var:可重复声明,可重新赋值
var num1 = 1;
var num1 = 100;
num1 = 200;
console.log(num1); // 200
// 2. let:不可重复声明,可重新赋值
let num2 = 2;
// let num2 = 200; // 报错
num2 = 200;
console.log(num2); // 200
// 3. const:不可重复声明,不可重新赋值
const num3 = 3;
// const num3 = 300; // 报错
//num3 = 300; // 报错
console.log(num3); // 3
-
var:可重复声明,可重新赋值
-
let:不可重复声明,可重新赋值
-
const:不可重复声明,不可重新赋值
补充点:
const声明引用数据类型,地址不能改,但内部内容可以改,const 锁的是变量存的地址,不是锁里面的内容
const person = {
name: "小明",
age: 20 };
// ✅ 可以修改内部属性
person.age = 21;
// ✅ 可以新增属性
person.gender = "男";
// ✅ 可以删除属性
delete person.name;
console.log(person); // 正常输出:{ age: 21, gender: '男' }
// ❌ 不能修改指向(重新赋值对象)
person = {}; // 报错
相信有了这些基础储备,当面试官问你时,可以很轻松的答出来
回答: 1,基础定义 2.为什么引入let const 3.变量提示与TDZ 4.重新声明与赋值