首页 > 其他分享 >ES6新特性详解:var、let、const的区别

ES6新特性详解:var、let、const的区别

时间:2025-01-18 17:28:03浏览次数:3  
标签:ES6 const 变量 let var console log

ECMAScript 6(简称ES6)是JavaScript语言的一次重大更新,它引入了许多新特性,使得JavaScript编程更加简洁、高效。在ES6中,对变量声明的方式进行了扩展,新增了letconst关键字,与原有的var关键字一起,为开发者提供了更多选择。本文将详细介绍varletconst三者之间的区别。

一、变量声明:varletconst的区别

1. 变量提升(Hoisting)

  • var声明的变量存在变量提升:这意味着变量可以在声明前使用,但其值会被初始化为undefined。这种特性有时会导致难以追踪的错误。

    console.log(myVar); // 输出:undefined
    var myVar = 5;
  • letconst不存在变量提升:尝试在声明前访问letconst声明的变量将导致ReferenceError错误。

    console.log(myLet); // 抛出 ReferenceError: myLet is not defined
    let myLet = 10;

2. 作用域(Scope)

  • letconst只能在块作用域里访问:块作用域是指由花括号{}包围的代码块。这使得letconst在函数内部或条件语句内部声明的变量,仅在该块内部有效。

    if (true) {
      let blockLet = 'inside block';
      console.log(blockLet); // 可以访问
    }
    console.log(blockLet); // 抛出 ReferenceError: blockLet is not defined
  • var是函数作用域或全局作用域:这意味着var声明的变量在整个函数或全局范围内都是可访问的。

    function myFunction() {
      var funcVar = 'inside function';
      console.log(funcVar); // 可以访问
    }
    myFunction();
    console.log(funcVar); // 可以访问

3. 同名变量声明

  • 同一作用域下,letconst不能声明同名变量:尝试在相同作用域内声明同名变量将导致SyntaxError错误。

    let myLet = 5;
    let myLet = 10; // 抛出 SyntaxError: Identifier 'myLet' has already been declared
  • var可以声明同名变量:在相同作用域内声明同名变量将覆盖之前的声明。

    var myVar = 5;
    var myVar = 10; // 不会报错,myVar 的值现在是 10

4. 常量定义

  • const用于定义常量const声明的变量必须在声明时初始化(即必须赋值),且其值在之后的代码中不能被重新赋值。

    const myConst = 5; // 正确
    // const myConst; // 抛出 SyntaxError: Missing initializer in const declaration
    myConst = 10; // 抛出 TypeError: Assignment to constant variable.
  • const定义的对象属性值可以改变:尽管const保证变量的引用不变,但如果变量是一个对象,其属性值是可以改变的。

    const person = {
      name: "test",
      age: 10
    };
    console.log(person); // 输出:{ name: 'test', age: 10 }
    person.name = "hello"; // 修改对象属性
    console.log(person); // 输出:{ name: 'hello', age: 10 }

5. 跨函数访问

  • var定义的变量可以跨函数访问:这意味着在函数外部声明的var变量可以在函数内部被访问和修改。

    var globalVar = 'global';
    function myFunction() {
      console.log(globalVar); // 可以访问
      globalVar = 'modified';
    }
    myFunction();
    console.log(globalVar); // 输出:'modified'
  • letconst不能跨函数访问:在函数外部声明的letconst变量不能在函数内部被访问。

    let globalLet = 'global';
    function myFunction() {
      // console.log(globalLet); // 抛出 ReferenceError: globalLet is not defined
    }
    myFunction();
    console.log(globalLet); // 输出:'global'

总结

varletconst三者在变量提升、作用域、同名变量声明、常量定义和跨函数访问等方面存在显著差异。在现代JavaScript开发中,推荐使用letconst来声明变量,因为它们提供了更严格的块级作用域控制,有助于避免变量提升和作用域相关的错误。const特别适合用于声明那些不应被重新赋值的常量。通过理解和掌握这些差异,你可以编写更清晰、更健壮的JavaScript代码。

标签:ES6,const,变量,let,var,console,log
From: https://blog.csdn.net/weixin_66708577/article/details/145228378

相关文章

  • 你不知道的javascript-13(var的接替者let与const)
    1.let与const的基本使用在ES5中我们声明变量都是使用的var(variable)关键字,从ES6开始新增了两个关键字可以声明变量:let、constlet、const在其他编程语言中都是有的,所以也并不是新鲜的关键字但是let、const确确实实给JavaScript带来一些不一样的东西从使用角度来说,只是在原......
  • mysql与postgresql的delete的区别
    语法和基本功能层面的相似性PostgreSQL和MySQL的DELETE语句在基本功能和语法上有很多相似之处。它们都用于从表中删除满足特定条件的行。在两种数据库中,基本的DELETE语句格式都是DELETEFROMtable_nameWHEREcondition;,其中table_name是要删除数据的表名,condition是筛选要......
  • Visual NAND Reconstructor 9.0, 新增 pSLC 闪存块数据恢复方案
    一、什么是pSLCpSLC(Pseudo-SingleLevelCell)即伪SLC,是将多层单元(MLC)或三层单元(TLC)闪存的一部分,通过固件管理,模拟成单层单元(SLC)闪存来使用的区域。它并非闪存芯片本身的物理差异,而是通过软件控制实现的。简单来说,就是把一部分MLC或TLC闪存暂时当作SLC闪存来用,从而提......
  • 《 C++ 点滴漫谈: 二十 》内存的权杖:C++ new 和 delete 的致胜之道
    摘要本文全面探讨了C++中的new和delete关键字及其在动态内存管理中的核心作用。从基本概念到底层实现,本文详细分析了其工作机制,并揭示了动态内存管理中的常见问题与陷阱,如内存泄漏和空悬指针。为解决这些问题,现代C++提供了智能指针和STL容器等高效替代方案,同时本......
  • 【微信小程序】let和const-综合实训
    let和const都是用于声明变量的关键字,它们与传统的var关键字相比,有很多不同之处。let声明块级作用域变量,可再赋值;const声明块级作用域常量,不可再赋值。以下是它们的详细介绍:一、基本概念letlet声明的变量只在块级作用域(用{}包裹的区域)内有效。它解决了var声......
  • 单例模式(Singleton Pattern)——游戏开发常用设计模式(一)
    前言单例模式应该是在unity游戏开发中最简单最常用的设计模式之一,无论是管理全局游戏状态、处理资源加载,还是控制音频播放,单例模式都能为我们提供一个简洁的解决方案——确保一个类只有一个实例,并允许在游戏的任何地方轻松访问它。然而,这种便利性也伴随着潜在的风险,比如代码耦合......
  • 使用 CompletableFuture 实现异步编程
    使用CompletableFuture实现异步编程在现代Java开发中,异步编程是一项重要技能。而CompletableFuture是从Java8开始提供的一个功能强大的工具,用于简化异步任务的编写和组合。本文将详细介绍CompletableFuture的基本使用和一些常见的应用场景。1.为什么选择Completab......
  • letta-ai - 为 LLM 应用注入记忆能力的开发框架
    该项目是用于构建具有记忆功能的LLM应用的Python框架,支持创建拥有长期记忆和持久状态的智能体(Agent),并能够集成多种LLMAPI服务。13800Stars1500Forks28Issues118贡献者Apache-2.0LicensePython语言代码:GitHub-letta-ai/letta:Letta(formerlyMemGPT)......
  • SpringBoot3整合Swagger3时出现Type javax.servlet.http.HttpServletRequest not pres
    目录错误详情错误原因解决方法引入依赖修改配置信息 创建文件 访问 错误详情错误原因SpringBoot3和Swagger3版本不匹配解决方法使用springdoc替代springfox,具体步骤如下:引入依赖在pom.xml文件中添加如下依赖:<dependency><groupId>org.springdoc<......
  • SpringBoot外置Servlet容器
    文章目录1.使用外置的Servlet容器2.先创建出SpringBoot项目2.1创建一个普通的mavenjava项目2.2在pom.xml中,设置打包方式为war包,引入父工程模板,左侧设置三级包结构2.3引入springboot的stater、web的starter、thymeleaf的模板引擎2.4创建启动类`SpringBootTomcatApplicatio......