JavaScript 中的 Var、Let 和 Const 有什么区别

这篇具有很好参考价值的文章主要介绍了JavaScript 中的 Var、Let 和 Const 有什么区别。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

ES2015(ES6)推出了许多闪亮的新功能。从 2020 年开始,我们假设许多 JavaScript 开发人员已经熟悉并开始使用这些功能。

尽管这个假设可能部分正确,但是其中某些功能可能对一些开发人员来说仍然是个谜。

ES6 附带的功能之一是添加了letconst,可用于变量声明。问题是,它们与var有何不同? 如果你仍然不清楚-那么读完本文你就知道了 😂。

在本文中,我们将讨论varletconst的作用域、用途和变量提升。当你阅读时,请注意我将指出的它们之间的差异。

Var

在 ES6 出现之前,必须使用 var 声明。但是,前端开发出现的一些问题与使用 var 声明的变量有关。这就是为什么必须要有新的方法来声明变量。首先,让我们在讨论这些问题之前更多地了解 var

var 的作用域

作用域本质上是指变量/函数可供访问的范围。var可以在全局范围声明或函数/局部范围内声明。

当在最外层函数的外部声明var变量时,作用域是全局的。这意味着在最外层函数的外部用var声明的任何变量都可以在windows中使用。

当在函数中声明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声明的变量会被提升到其作用域的顶部,并使用 undefined 值对其进行初始化.

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重新定义为saysay Hello。如果你有是故意重新定义greeter,这段代码是问题的,但是当你不知道之前已经定义了变量greeter时,这将成为产生问题。

如果在代码的其他部分使用了greeter,这可能会导致代码中出现许多错误。这就是为什么需要letconst的原因。

Let

let现在已经成为变量声明的首选。这并不奇怪,因为它是对var声明的改进。它也解决了我们刚刚介绍的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声明的变量保持常量值。 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声明对象时,这种行为却有所不同。虽然不能更新const对象,但是可以更新该对象的属性。 因此,如果我们声明一个const对象为

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声明是全局作用域或函数作用域,而letconst是块作用域。
  • var变量可以在其范围内更新和重新声明; let变量可以被更新但不能重新声明; const变量既不能更新也不能重新声明。
  • 它们都被提升到其作用域的顶端。但是,虽然使用变量undefined初始化了var变量,但未初始化letconst变量。
  • 尽管可以在不初始化的情况下声明varlet,但是在声明期间必须初始化const

Var, Let, and Const – What's the Difference?文章来源地址https://www.toymoban.com/news/detail-700836.html

到了这里,关于JavaScript 中的 Var、Let 和 Const 有什么区别的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【前端知识】JavaScript——var 与 let 的区别

    var声明的变量会自动提升到函数作用域顶部,而let不会。 在解析代码时,JavaScript 引擎会注意出现在块后面的 let 声明,只不过在此之前不能以任何方式来引用未声明的变量。在 let 声明之前的执行瞬间被称为 暂时性死区(temporal dead zone) ,在此阶段引用任何后面才声明的变

    2024年02月16日
    浏览(46)
  • const、let、var区别

    let和const是ES6新增的声明变量的,之前声明变量的是var。 ES6 新增了 let 命令,用来声明变量。它的用法类似于 var ,但是所声明的变量,只在 let 命令所在的代码块内有效。 上面代码在代码块之中,分别用 let 和 var 声明了两个变量。然后在代码块之外调用这两个

    2024年02月08日
    浏览(45)
  • var、let、const 之间的区别

    在 ES5 中 , 顶层对象的属性和全局变量是等价的 , 用 var 声明的变量既是全局变量 , 也是顶层变量。 注意 : 顶层对象 , 在浏览器环境指的是 window 对 象 , 在 Node 指的是 global 对象 使用 var 声明的变量存在 变量提升 的情况 在编译阶段 , 编译器会将其变成以下执行 使用 var , 能够

    2024年02月03日
    浏览(38)
  • let、const、var的区别,解构赋值,箭头函数

    使用var声明的变量,其作用域为该语句所在的函数内,且存在变量提升现象。 使用let声明的变量,其作用域为该语句所在的代码块内,不存在变量提升。 使用const声明的是常量,在后面出现的代码块中,不能在修改改常量的值。 var let const 函数级作用域 块级作用域 块级作用域 变量提

    2024年02月05日
    浏览(54)
  • ES6中let和const关键字与var关键字之间的区别?

    前端入门之旅:探索Web开发的奇妙世界 欢迎来到前端入门之旅!感兴趣的可以订阅本专栏哦!这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发者,这里都将为你提供一个系统而又亲切的学习平台。在这个

    2024年02月09日
    浏览(54)
  • const、var、let用法

    当使用 var 声明变量时,该变量的作用域是在最近的函数体内,而不是块级作用域(例如 if 语句、 for 循环等)。这意味着在函数内部,无论变量是在函数的哪个位置声明的,它都可以被访问到。 另外,使用 var 声明的变量具有变量提升(hoisting)的特性。这意味着变量声明会

    2024年02月11日
    浏览(56)
  • ES6知识点汇总(1)--var/let/const

    1、var 在ES5中,顶层对象的属性和全局变量是等价的,用var声明的变量既是全局变量,也是顶层变量 注意:顶层对象,在浏览器环境指的是window对象,在 Node 指的是global对象 使用var声明的变量存在变量提升的情况 在编译阶段,编译器会将其变成以下执行 使用var,我们能够对

    2024年02月12日
    浏览(50)
  • JS中var、let以及const关键字到底怎么用?

    在学习JS变量之后,初学者都避免不了都会一下子分不清这三个变量在代码块中的作用域范围,其实 const 简单理解它就是定义常量的,但是在实际开发中,我们却很常见它的身影。 说实话刚开始我也分不清他们的作用域范围,但是自己再去详细看一遍教程之后,其实发现还是

    2023年04月13日
    浏览(43)
  • JavaScript中的map()和forEach()方法有什么区别?

    聚沙成塔·每天进步一点点 前端入门之旅:探索Web开发的奇妙世界 欢迎来到前端入门之旅!感兴趣的可以订阅本专栏哦!这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发者,这里都将为你提供一个系统而

    2024年02月06日
    浏览(49)
  • let和var区别 (最全)

    1、var是函数作用域,let是块作用域 2、var存在声明提升,let没有声明提升,但是有“暂时性死区”-JS引擎会注意到出现在块后面的let声明,在声明前直接使用会抛出ReferenceError, 3、全局作用域下,var声明的变量挂载在window,let不会 4、在for循环中使用let, let出现直线,for循环定

    2024年01月16日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包