前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >let、const和var的区别是什么?

let、const和var的区别是什么?

作者头像
王小婷
发布2025-05-25 16:09:21
发布2025-05-25 16:09:21
9500
代码可运行
举报
文章被收录于专栏:编程微刊编程微刊
运行总次数:0
代码可运行

在JavaScript中,letconstvar 是用于声明变量的三种关键字。虽然它们的功能相似,但在作用域、提升、可变性以及使用方式等方面存在显著差异。理解这些差异对于编写高质量、可维护的代码至关重要。本文将详细探讨这三种关键字的区别。

一、var 的特点

1. 作用域

var 声明的变量具有函数作用域(function scope)。这意味着变量在声明它的函数内可见,或者在全局范围内可见,如果它是在函数外部声明的。

示例
代码语言:javascript
代码运行次数:0
运行
复制
function testVar() {
    var x = 10;
    if (true) {
        var x = 20; // 同一作用域
        console.log(x); // 输出: 20
    }
    console.log(x); // 输出: 20
}

testVar();

在这个例子中,xif 语句块内被重新赋值,这影响了函数中的 x 变量。

2. 提升(Hoisting)

var 声明的变量在其作用域内是提升的。这意味着在实际声明之前,可以引用该变量,但值为 undefined

示例
代码语言:javascript
代码运行次数:0
运行
复制
console.log(y); // 输出: undefined
var y = 5;
console.log(y); // 输出: 5

在这个例子中,虽然 y 的声明在 console.log() 之后,但由于提升,它仍然可以在调用之前访问,返回 undefined

3. 全局变量

在全局作用域中使用 var 声明的变量会成为全局对象的属性。在浏览器中,全局对象是 window

示例
代码语言:javascript
代码运行次数:0
运行
复制
var globalVar = 'I am global';
console.log(window.globalVar); // 输出: I am global

二、let 的特点

1. 作用域

let 声明的变量具有块作用域(block scope)。这意味着变量只在其所在的代码块内可见。

示例
代码语言:javascript
代码运行次数:0
运行
复制
function testLet() {
    let x = 10;
    if (true) {
        let x = 20; // 不同的作用域
        console.log(x); // 输出: 20
    }
    console.log(x); // 输出: 10
}

testLet();

在这个例子中,内部的 x 不会影响外部的 x,它们是不同的变量。

2. 提升(Hoisting)

let 声明的变量同样会被提升,但在变量声明之前,访问它们会导致 ReferenceError。这被称为“暂时性死区”(Temporal Dead Zone)。

示例
代码语言:javascript
代码运行次数:0
运行
复制
console.log(z); // ReferenceError: Cannot access 'z' before initialization
let z = 5;

在这个例子中,z 在声明之前被访问会导致错误。

3. 不允许重复声明

在同一作用域中,不能使用 let 重复声明同一个变量。

示例
代码语言:javascript
代码运行次数:0
运行
复制
let a = 1;
let a = 2; // SyntaxError: Identifier 'a' has already been declared

三、const 的特点

1. 作用域

const 的作用域与 let 相同,都是块作用域。

示例
代码语言:javascript
代码运行次数:0
运行
复制
function testConst() {
    const a = 10;
    if (true) {
        const a = 20; // 不同的作用域
        console.log(a); // 输出: 20
    }
    console.log(a); // 输出: 10
}

testConst();
2. 不可变性

使用 const 声明的变量必须在声明时初始化,并且不能被重新赋值。需要注意的是,const 声明的对象或数组的内容是可以修改的。

示例
代码语言:javascript
代码运行次数:0
运行
复制
const b = 5;
// b = 10; // TypeError: Assignment to constant variable.

const obj = { prop: 1 };
obj.prop = 2; // 允许修改对象的属性
console.log(obj.prop); // 输出: 2

在这个例子中,b 不能被重新赋值,但 obj 的属性可以被修改。

3. 提升(Hoisting)

constlet 都会被提升,并且在声明之前访问也会导致 ReferenceError

示例
代码语言:javascript
代码运行次数:0
运行
复制
console.log(c); // ReferenceError: Cannot access 'c' before initialization
const c = 5;

四、总结与比较

特性

var

let

const

作用域

函数作用域

块作用域

块作用域

提升

是,值为 undefined

是,暂时性死区

是,暂时性死区

重新赋值

允许

允许

不允许

重复声明

允许

不允许

不允许

全局变量

成为全局对象的属性

不会成为全局对象的属性

不会成为全局对象的属性

五、最佳实践

  1. 使用 letconst:一般建议使用 letconst,避免使用 varconst 应该作为默认选择,除非需要在后续代码中重新赋值。
  2. 块作用域:利用 letconst 的块作用域来减少变量的生命周期,提高代码的可读性。
  3. 避免全局变量:尽量避免在全局作用域中使用 var,以减少潜在的命名冲突和污染。
  4. 使用 const 来声明常量:对于不会被重新赋值的变量,使用 const 来表明它的不可变性。
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-05-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、var 的特点
    • 1. 作用域
      • 示例
    • 2. 提升(Hoisting)
      • 示例
    • 3. 全局变量
      • 示例
  • 二、let 的特点
    • 1. 作用域
      • 示例
    • 2. 提升(Hoisting)
      • 示例
    • 3. 不允许重复声明
      • 示例
  • 三、const 的特点
    • 1. 作用域
      • 示例
    • 2. 不可变性
      • 示例
    • 3. 提升(Hoisting)
      • 示例
  • 四、总结与比较
  • 五、最佳实践
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档