前端面试:谈谈你对var let const 的理解?

32 阅读3分钟

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.重新声明与赋值