Var、let 和 const——有什么区别?
ES2015(ES6)带来了许多闪亮的新功能。如今已是2017年,人们普遍认为许多JavaScript开发者已经熟悉并开始使用这些功能。虽然这种假设可能成立,但其中一些功能对某些人来说可能仍然充满神秘感。
ES6 新增的功能之一是 和let
,const
可用于变量声明。现在的问题是,它们与我们var
一直在使用的 和 有什么不同?如果你还不清楚这一点,那么这篇文章正适合你。
本文将讨论 和 的范围、用法和提升。阅读时,请注意我将指出的它们之间的区别var
。let
const
风险自回归
在 ES6 出现之前,var
声明是王道。使用“虽然”声明的变量存在一些问题var
。因此,有必要开发新的变量声明方式。不过,var
在讨论其中一个问题之前,我们先来深入了解一下。
范围var
作用域本质上是指这些变量在何处可用。var
声明的作用域分为全局作用域和函数/局部作用域。当var
变量在函数外部声明时,它具有全局作用域。这意味着任何在var
函数块外部声明的变量都可以在整个窗口中使用。var
当变量在函数内部声明时,它具有函数作用域。这意味着它只能在该函数内部使用和访问。
为了进一步理解,请看下面的示例。
var greeter = "hey hi";
function newFunction() {
var hello = "hello";
}
这里,greeter
是全局作用域的,因为它存在于函数外部,而是函数作用域的。所以我们无法在函数外部hello
访问该变量。因此,如果我们这样做:hello
var tester = "hey hi";
function newFunction() {
var hello = "hello";
}
console.log(hello); // error: hello is not defined
我们将收到一个错误,这是由于hello
函数外部不可用造成的。
var
变量可以重新声明和更新
这意味着我们可以在相同的范围内执行此操作并且不会出现错误。
var greeter = "hey hi";
var greeter = "say Hello instead";
这也
var greeter = "hey hi";
greeter = "say Hello instead";
吊装var
提升是一种 JavaScript 机制,在代码执行之前,变量和函数声明会被移动到其作用域的顶部。这意味着如果我们这样做:
console.log (greeter);
var greeter = "say hello"
它被解释为
var greeter;
console.log(greeter); //greeter is undefined
greeter = "say hello"
因此var
变量被提升到其范围的顶部并用未定义的值初始化。
问题var
但它也有一个弱点var
。我将用下面的例子来解释这一点。
var greeter = "hey hi";
var times = 4;
if (times > 3) {
var greeter = "say Hello instead";
}
console.log(greeter) //"say Hello instead"
因此,由于times > 3
返回 true,greeter
所以被重新定义为"say Hello instead"
。虽然如果您有意greeter
重新定义,这不会造成问题,但如果您没有意识到变量greeter
之前已被定义,就会出现问题。
如果您在代码的其他部分使用了greeter
,您可能会对得到的输出感到惊讶。这可能会导致代码中出现很多错误。这就是为什么let
和const
是必要的。
让
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
我们发现,hello
在变量的块外(即定义变量的花括号内)使用会返回错误。这是因为let
变量是块作用域的。
let
可以更新但不能重新声明。
与 类似var
,用 声明的变量let
可以在其作用域内更新。与 不同var
,let
变量不能在其作用域内重新声明。因此,虽然这样可以,
let greeting = "say Hi";
greeting = "say Hello instead";
这将返回一个错误。
let greeting = "say Hi";
let greeting = "say Hello instead";//error: Identifier 'greeting' has already been declared
但是如果在不同的作用域中定义同一个变量,则不会出现错误。
let greeting = "say Hi";
if (true) {
let greeting = "say Hello instead";
console.log(greeting);//"say Hello instead"
}
console.log(greeting);//"say Hi"
为什么没有错误?这是因为两个实例具有不同的作用域,因此被视为不同的变量。
事实证明,这是let
一个比 更好的选择var
。使用 时let
,您无需担心之前是否使用过变量名称,因为变量仅存在于其作用域内。此外,由于变量在一个作用域内不能声明多次,因此之前讨论的 中出现的问题var
不会发生。
的提升:let
与 类似var
,let
声明会被提升到顶部。与var
初始化为不同undefined
,let
关键字 未初始化。因此,如果您尝试let
在声明之前使用变量,则会得到Reference Error
。
常量
用保持常量值声明的变量const
。const
声明与声明有一些相似之处let
。
const
声明是块作用域的
与声明类似let
,const
声明只能在声明的块内访问。
const
无法更新或重新声明
这意味着用 声明的变量的值const
在其作用域内保持不变。它不能被更新或重新声明。所以如果我们用 声明一个变量const
,我们既不能这样做,也不能这样做。
const greeting = "say Hi";
greeting = "say Hello instead";//error : Assignment to constant variable.
也不是这个
const greeting = "say Hi";
const greeting = "say Hello instead";//error : Identifier 'greeting' has already been declared
因此,每个 const 声明都必须在声明时初始化。
对于使用 声明的对象,这种行为有所不同const
。虽然 aconst
对象无法更新,但 this 对象的属性可以更新。因此,如果我们将一个const
对象声明为 this
const greeting = {
message : "say Hi",
times : 4
}
虽然我们做不到这一点
const greeting = {
words : "Hello",
number : "five"
}//error : Assignment to constant variable.
我们可以做到这一点
greeting.message = "say Hello instead";
这将更新的值greeting.message
而不会返回错误。
吊装const
就像一样let
,const
声明被提升到顶部但未被初始化。
因此,以防万一您错过了这些差异,它们如下:
-
var
声明是全局作用域或函数作用域,let
而const
声明是块作用域。 -
var
变量可以在其作用域内更新和重新声明;let
变量可以更新但不能重新声明;const
变量既不能更新也不能重新声明。 -
它们都被提升到其范围的顶部,但是 while
var
变量用 初始化undefined
,let
而const
变量未初始化。 -
var
和let
可以在未初始化的情况下声明,const
但必须在声明时初始化。
有任何问题或补充吗?请留言。
感谢您的阅读:)
文章来源:https://dev.to/sarah_chima/var-let-and-const--whats-the-difference-69e