Var、let 和 const——有什么区别?

2025-05-26

Var、let 和 const——有什么区别?

ES2015(ES6)带来了许多闪亮的新功能。如今已是2017年,人们普遍认为许多JavaScript开发者已经熟悉并开始使用这些功能。虽然这种假设可能成立,但其中一些功能对某些人来说可能仍然充满神秘感。

ES6 新增的功能之一是 和letconst可用于变量声明。现在的问题是,它们与我们var一直在使用的 和 有什么不同?如果你还不清楚这一点,那么这篇文章正适合你。

本文讨论 和 的范围、用法和提升。阅读时,请注意我将指出的它们之间的区别varletconst

风险自回归

在 ES6 出现之前,var声明是王道。使用“虽然”声明的变量存在一些问题var。因此,有必要开发新的变量声明方式。不过,var在讨论其中一个问题之前,我们先来深入了解一下。

范围var

作用域本质上是指这些变量在何处可用。var声明的作用域分为全局作用域和函数/局部作用域。当var变量在函数外部声明时,它具有全局作用域。这意味着任何在var函数块外部声明的变量都可以在整个窗口中使用。var当变量在函数内部声明时,它具有函数作用域。这意味着它只能在该函数内部使用和访问。
为了进一步理解,请看下面的示例。

    var greeter = "hey hi";

    function newFunction() {
        var hello = "hello";
    }
Enter fullscreen mode Exit fullscreen mode

这里,greeter是全局作用域的,因为它存在于函数外部,而是函数作用域的。所以我们无法在函数外部hello访问该变量。因此,如果我们这样做:hello

    var tester = "hey hi";

    function newFunction() {
        var hello = "hello";
    }
    console.log(hello); // error: hello is not defined
Enter fullscreen mode Exit fullscreen mode

我们将收到一个错误,这是由于hello函数外部不可用造成的。

var变量可以重新声明和更新

这意味着我们可以在相同的范围内执行此操作并且不会出现错误。

    var greeter = "hey hi";
    var greeter = "say Hello instead";
Enter fullscreen mode Exit fullscreen mode

这也

    var greeter = "hey hi";
    greeter = "say Hello instead";
Enter fullscreen mode Exit fullscreen mode

吊装var

提升是一种 JavaScript 机制,在代码执行之前,变量和函数声明会被移动到其作用域的顶部。这意味着如果我们这样做:

    console.log (greeter);
    var greeter = "say hello"
Enter fullscreen mode Exit fullscreen mode

它被解释为

    var greeter;
    console.log(greeter); //greeter is undefined
    greeter = "say hello"
Enter fullscreen mode Exit fullscreen mode

因此var变量被提升到其范围的顶部并用未定义的值初始化。

问题var

但它也有一个弱点var。我将用下面的例子来解释这一点。

    var greeter = "hey hi";
    var times = 4;

    if (times > 3) {
        var greeter = "say Hello instead"; 
    }

    console.log(greeter) //"say Hello instead"
Enter fullscreen mode Exit fullscreen mode

因此,由于times > 3返回 true,greeter所以被重新定义为"say Hello instead"。虽然如果您有意greeter重新定义,这不会造成问题,但如果您没有意识到变量greeter之前已被定义,就会出现问题。
如果您在代码的其他部分使用了greeter,您可能会对得到的输出感到惊讶。这可能会导致代码中出现很多错误。这就是为什么letconst是必要的。

let现在是变量声明的首选。这并不奇怪,因为它是对声明的改进var。它也解决了上一小节中提出的问题。让我们来思考一下为什么会这样。

let是块范围的

代码块是由 {} 包围的一段代码。代码块位于花括号内。花括号内的所有内容都是代码块。因此,在代码块中用 {} 声明的变量let只能在该代码块内使用。我来举个例子来解释一下。

   let greeting = "say Hi";
   let times = 4;

   if (times > 3) {
        let hello = "say Hello instead";
        console.log(hello);//"say Hello instead"
    }
   console.log(hello) // hello is not defined
Enter fullscreen mode Exit fullscreen mode

我们发现,hello在变量的块外(即定义变量的花括号内)使用会返回错误。这是因为let变量是块作用域的。

let可以更新但不能重新声明。

与 类似var,用 声明的变量let可以在其作用域内更新。与 不同varlet变量不能在其作用域内重新声明。因此,虽然这样可以,

    let greeting = "say Hi";
    greeting = "say Hello instead";
Enter fullscreen mode Exit fullscreen mode

这将返回一个错误。

    let greeting = "say Hi";
    let greeting = "say Hello instead";//error: Identifier 'greeting' has already been declared
Enter fullscreen mode Exit fullscreen mode

但是如果在不同的作用域中定义同一个变量,则不会出现错误。

    let greeting = "say Hi";
    if (true) {
        let greeting = "say Hello instead";
        console.log(greeting);//"say Hello instead"
    }
    console.log(greeting);//"say Hi"
Enter fullscreen mode Exit fullscreen mode

为什么没有错误?这是因为两个实例具有不同的作用域,因此被视为不同的变量。

事实证明,这是let一个比 更好的选择var。使用 时let,您无需担心之前是否使用过变量名称,因为变量仅存在于其作用域内。此外,由于变量在一个作用域内不能声明多次,因此之前讨论的 中出现的问题var不会发生。

的提升:let
与 类似varlet声明会被提升到顶部。与var初始化为不同undefinedlet关键字 未初始化。因此,如果您尝试let在声明之前使用变量,则会得到Reference Error

常量

用保持常量值声明的变量constconst声明与声明有一些相似之处let

const声明是块作用域的

与声明类似letconst声明只能在声明的块内访问。

const无法更新或重新声明

这意味着用 声明的变量的值const在其作用域内保持不变。它不能被更新或重新声明。所以如果我们用 声明一个变量const,我们既不能这样做,也不能这样做。

    const greeting = "say Hi";
    greeting = "say Hello instead";//error : Assignment to constant variable. 
Enter fullscreen mode Exit fullscreen mode

也不是这个

    const greeting = "say Hi";
    const greeting = "say Hello instead";//error : Identifier 'greeting' has already been declared
Enter fullscreen mode Exit fullscreen mode

因此,每个 const 声明都必须在声明时初始化。
对于使用 声明的对象,这种行为有所不同const。虽然 aconst对象无法更新,但 this 对象的属性可以更新。因此,如果我们将一个const对象声明为 this

    const greeting = {
        message : "say Hi",
        times : 4
    }
Enter fullscreen mode Exit fullscreen mode

虽然我们做不到这一点

    const greeting = {
        words : "Hello",
        number : "five"
    }//error :  Assignment to constant variable.
Enter fullscreen mode Exit fullscreen mode

我们可以做到这一点

    greeting.message = "say Hello instead";
Enter fullscreen mode Exit fullscreen mode

这将更新的值greeting.message而不会返回错误。

吊装const

就像一样letconst声明被提升到顶部但未被初始化。

因此,以防万一您错过了这些差异,它们如下:

  1. var声明是全局作用域或函数作用域,letconst声明是块作用域。

  2. var变量可以在其作用域内更新和重新声明;let变量可以更新但不能重新声明;const变量既不能更新也不能重新声明。

  3. 它们都被提升到其范围的顶部,但是 whilevar变量用 初始化undefinedletconst变量未初始化。

  4. varlet可以在未初始化的情况下声明,const但必须在声明时初始化。

有任何问题或补充吗?请留言。

感谢您的阅读:)

文章来源:https://dev.to/sarah_chima/var-let-and-const--whats-the-difference-69e
PREV
避免 React useEffect 中的竞争条件和内存泄漏
NEXT
使用本地存储