js的var、let、const三者异同

本文详细讲解了var声明变量的提升机制、let和const的块级作用域特性,以及它们在初始化、修改和重声明上的区别。重点讨论了变量提升和不同作用域下的行为变化。

var的变量提升

var声明的变量会被提升到其作用域的顶部,并使用 undefined 值对其进行初始化.

 alert(greeter); 
 var greeter = 'say hello';

 //前面的代码会被解析为:

 var greeter;
 alret(greeter); // greeter is undefined
 greeter = 'say hello';

let声明的变量

let 是块级作用域,声明的变量保持常量值就像var一样,用let声明的变量可以在其范围内被修改。但与var不同的是,let变量无法在其作用域内被重新声明。用let声明的变量同样会被提升到其作用域的顶部,但不会对值进行初始化,因此,如果你尝试在声明前使用let变量,则会收到Reference Error的报错。

//let变量无法在其作用域内被重新声明:

let greeting = 'say Hi';
greeting = 'say Hei instead'; 
let greeting = 'say Hello instead'; // error: Identifier 'greeting' has already been declared

如果在不同的作用域中定义了相同的let变量,则不会有错误。

 //不同的作用域中定义了相同的let变量,不会有错误:

let greeting = 'say Hi';
if (true) {
    let greeting = 'say Hello instead';
    console.log(greeting); // "say Hello instead"
}
console.log(greeting); // "say Hi"

const 声明的变量

const 是块级作用域,声明的变量保持常量值,不能被修改并且不能被重新声明,因此,每个const声明都必须在声明时进行初始化。

//const变量保持常量值,不能被修改并且不能被重新声明:

const greeting = 'say Hi';
greeting = 'say Hello instead'; // error: Assignment to constant variable.
const greeting = 'say Hello instead'; // error: Identifier 'greeting' has already been declared

虽然不能更新const对象,但是可以更新该对象的属性。

const greeting = {
    message: 'say Hi',
    times: 4,
};

//正确的修改:
greeting.message = 'say Hello instead';

//错误的修改:
const greeting = {
    words: 'Hello',
    number: 'five',
}; // error:  Assignment to constant variable.

最后,我们总结一下它们的异同:

  • var声明是全局作用域或函数作用域(看你声明在哪里,声明在函数外就是全局),而let和const是块作用域
  • var变量可以在其范围内更新和重新声明; let变量可以被更新但不能重新声明; const变量既不能更新也不能重新声明
  • 它们都会被提升到其作用域的顶端。但是只有var变量会用“undefined”初始化,不会初始化let和const变量。
  • 可以在不初始化的情况下声明var和let,但是在声明期间必须初始化const
以下是 JavaScript 中 `var`、`let` `const` 的**异同对比**,它们用于声明变量,但在作用域、变量提升、重复声明、赋值行为等方面存在显著差异。 --- ## ✅ 三者对比表: | 特性 | `var` | `let` | `const` | |------|-------|-------|---------| | **作用域** | 函数作用域 | 块级作用域 | 块级作用域 | | **变量提升(Hoisting)** | 是(初始化为 `undefined`) | 是(但进入“暂时性死区”) | 是(但进入“暂时性死区”) | | **能否重复声明** | 是(允许) | 否(不允许) | 否(不允许) | | **能否重新赋值** | 是 | 是 | 否(常量,不能重新赋值) | | **是否绑定全局对象(如 `window`)** | 是 | 否 | 否 | | **典型使用场景** | ES5 及之前的变量声明 | ES6 中推荐的变量声明 | 声明常量,值不可变 | --- ## 🧠 详细说明: ### 1. `var`:函数作用域 + 变量提升 ```javascript if (true) { var x = 10; } console.log(x); // 输出 10,因为 var 是函数作用域,不是块级作用域 console.log(y); // 输出 undefined(变量提升) var y = 20; ``` ### 2. `let`:块级作用域 + 不允许重复声明 ```javascript if (true) { let a = 10; } console.log(a); // 报错:a is not defined let b = 20; let b = 30; // 报错:Identifier 'b' has already been declared ``` ### 3. `const`:块级作用域 + 常量(不可重新赋值) ```javascript const PI = 3.14; PI = 3.1415; // 报错:Assignment to constant variable. const obj = { name: "Tom" }; obj.name = "Jerry"; // 允许修改对象属性 obj = {}; // 报错:不能重新赋值给 const 声明的变量 const c; c = 10; // 报错:const 声明的变量必须立即初始化 ``` --- ## 📌 使用建议(最佳实践): - ✅ 优先使用 `const`,当你不打算修改变量值时。 - ✅ 次之使用 `let`,当你需要重新赋值时。 - ❌ 避免使用 `var`,除非你需要兼容老旧浏览器或代码库。 --- ## 🧪 示例对比: ```javascript function test() { var a = 1; let b = 2; const c = 3; if (true) { var a = 4; // 修改外层 var a let b = 5; // 新的 let b,块级作用域 const c = 6; console.log(a, b, c); // 4 5 6 } console.log(a, b, c); // 4 2 3 } test(); ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Janthrven

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值