var、let、const之间的区别

news2024/9/23 1:39:50

说一下var、let、const之间的区别

  • 一、var
  • 二、let
  • 三、const
  • 四、var、let 、const的区别?

一、var

  • 用var声明的变量既是全局变量,也是顶层变量

    注意:顶层对象,在浏览器环境指的是window对象,在Node指的是global对象。

    var a = 111;
    console.log(window.a) // 111
    

    使用var声明的变量存在变量提升的情况

    console.log(a) // undefined
    var a = 222
    
  • 使用var,我们能够对一个变量进行多次声明,后面声明的变量会覆盖前面的变量声明

    var a = 333
    var a = 444
    console.log(a) // 333
    
  • 在函数中使用使用var声明变量时候,该变量是局部的

    var a = 20
    function change(){
        var a = 30
    }
    change()
    console.log(a) // 20 
    
  • 而如果在函数内不使用var,该变量是全局的

    var a = 20
    function change(){
       a = 30
    }
    change()
    console.log(a) // 30 
    

二、let

let是ES6新增的命令,用来声明变量
  • 用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效

      <script>
            {
                let a = 20
            }
            console.log(a);  // ReferenceError: a is not defined.
        </script>
    
  • 不存在变量提升

    console.log(a) // 报错ReferenceError
    let a = 2
    

    在这里插入图片描述

    这表示在声明它之前,变量a是不存在的,这时如果用到它,就会抛出一个错误

  • 只要块级作用域内存在let命令,这个区域就不再受外部影响

    	var a = 123
    if (true) {
        a = 'abc' // ReferenceError
        let a;
    }
    

    使用let声明变量前,该变量都不可用,也就是大家常说的“暂时性死区”

  • 最后,let不允许在相同作用域中重复声明

    let a = 20
    let a = 30
    // Uncaught SyntaxError: Identifier 'a' has already been declared
    
  • 注意的是相同作用域,下面这种情况是不会报错的

    let a = 20
    {
        let a = 30
    }
    
  • 因此,我们不能在函数内部重新声明参数

    function func(arg) {
      let arg;
    }
    func()
    // Uncaught SyntaxError: Identifier 'arg' has already been declared
    

三、const

  • const声明一个只读的常量,一旦声明,常量的值就不能改变.

    const a = 1
    a = 3
    // TypeError: Assignment to constant variable.
    
  • 这意味着,const一旦声明变量,就必须立即初始化,不能留到以后赋值

    const a;
    // SyntaxError: Missing initializer in const declaration
    
  • 如果之前用var或let声明过变量,再用const声明同样会报错

    var a = 20
    let b = 20
    const a = 30
    const b = 30
    // 都会报错
    
  • const实际上保证的并不是变量的值不得改动,而是变量指向的那个内存地址所保存的数据不得改动

    对于简单类型的数据,值就保存在变量指向的那个内存地址,因此等同于常量

    对于复杂类型的数据,变量指向的内存地址,保存的只是一个指向实际数据的指针,const只能保证这个指针是固定的,并不能确保改变量的结构不变

    const foo = {};
    
    // 为 foo 添加一个属性,可以成功
    foo.prop = 123;
    foo.prop // 123
    
    // 将 foo 指向另一个对象,就会报错
    foo = {}; // TypeError: "foo" is read-only
    

四、var、let 、const的区别?

  1. 变量提升

var声明的变量存在变量提升,即变量可以在声明之前调用,值为undefined。
let和const作用域为块级作用域,不存在变量提升。

  1. 重复声明

var可以定义多个同名变量,允许重复声明。
let和const在同一作用域不允许重复声明变量,只能出现一次。

  1. 块级作用域

var不存在块级作用域
let和const存在块级作用域

  1. 暂时性死区

var不存在暂时性死区
let和const存在暂时性死区,只能等到声明变量的那一行代码出现,才可以获取和使用该变量。

  1. 修改声明的变量

var 和 let 可以
const 声明一个只读的常量。一旦声明,常量的值就不能改变。

  1. 能使用const的情况尽量使用const,其他情况下大多数使用 let,避免使用var。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/188276.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

老杨说运维 | AIOps如何助力实现全面可观测性(下)

上期我们讲到可观测性是什么&#xff0c;以及它能给企业带来的价值&#xff0c; 戳→「老杨说运维 | AIOps如何助力实现全面可观测性&#xff08;上&#xff09;」一键回看上期精彩内容。 说完了什么是可观测性&#xff0c;这期我们来看看可观测性是如何落地实践的。 一、可观…

若依配置教程(五)数据权限的使用及配置

文章目录一、Controller模块二、Mapper.xml三、在Impl服务层加入权限注解四、分配数据权限若依文档 学会了前几篇文章如何新建模块和生成代码&#xff0c;这篇接下来介绍数据权限的配置和使用&#xff1a; 首先&#xff0c;在建立数据库表的时候&#xff0c;必须要添加user_id…

深入理解spring三级缓存解决循环依赖的设计思路

说到这个话题的时候&#xff0c;很多人再熟悉不过了&#xff0c;因为听到太多了&#xff0c;而且百度一大堆&#xff0c;但是理解到什么程度了呢&#xff0c;或者说只是知道这回事&#xff0c;但是为什么这样设计&#xff0c;代码中有什么可以借鉴的&#xff0c;在实际业务中有…

Jmeter和JDK下载安装及环境变量配置详细教程

写在最前面的话&#xff0c;jmeter安装部署依赖java环境&#xff0c;所以得安装JDK java环境检查 命令行输入&#xff1a;java -version 如果出现以下内容&#xff0c;说明java环境已安装&#xff0c;无需理会&#xff0c;如果没有&#xff0c;需要安装JDK 一、下载并安装JDK…

PSP模拟器截图CG的高清化-Waifu2x

由PSP游戏本体提取CG图片直接超分自然是比较舒服的&#xff0c;但实际上因了加密等诸多问题&#xff0c;甚或不如直接模拟器截了图进行处理来得方便 1. 模拟器设置 如果要截图的话&#xff0c;自然是以得到更好的效果为宜&#xff0c;于是可以对模拟器进行一些基本的设置。 对…

Java两大工具库:Commons和Guava(3)

您好&#xff0c;我是湘王&#xff0c;这是我的CSDN博客。值此新春佳节&#xff0c;我给您拜年啦&#xff5e;祝您在新的一年中所求皆所愿&#xff0c;所行皆坦途&#xff0c;展宏“兔”&#xff0c;有钱“兔”&#xff0c;多喜乐&#xff0c;常安宁&#xff01;虽然Apache Com…

【33】C语言 | 联合体详解

目录 1、联合类型的定义 2、联合的特点 3、联合大小的计算 1、联合类型的定义 联合也是一种特殊的自定义类型这种类型定义的变量也包含一系列的成员&#xff0c;特征是这些成员公用同一块空间《所以联合也叫共用体)先看下面代码输出什么&#xff1f; union Un {char c;int …

我用css3为好友胡歌的宝宝做了一个动画照片墙

软件人生风雨十年&#xff0c;仙剑一过去也有十年有余了&#xff0c;和胡歌认识那么久&#xff0c;今日喜闻好友胡歌生宝宝的消息&#xff0c;惊喜之余用css3为胡歌的宝宝做了动画照片墙的模板效果。 目录 1. 实现思路 2. 墙体的实现 3. 选取模板素材&#xff0c;进行图片元…

虹科案例 | 石油天然气行业CFD高性能计算解决方案

公司简介 DNV GL 是全球领先的能源、石油和海事行业风险管理及资产绩效提升的软件供应商&#xff0c;主要为客户提供全面的风险管理和各类评估认证服务&#xff0c;认证涉及信息通信技术、汽车及航空天、食品与饮料、医疗等方面。 DNV GL以让世界更安全、更智能、更环保为使命…

随笔记——MQ

文章目录1、 概要2、 为什么使用MQ/使用MQ的好处&#xff1f;3、 使用MQ的缺点&#xff1f;4、 使用MQ会产生的问题及解决办法&#xff1f;4.1、如何保证消息的顺序性&#xff1f;4.2、如何解决消息被重复消费&#xff1f;4.3、如何解决消息丢失&#xff1f;4.4、如何解决消息积…

基于turtle实现的新冠疫情传播模拟 附完整代码可直接运行

代码运行视频参考:https://www.bilibili.com/video/BV1hR4y1h7Te/?spm_id_from=333.999.0.0&vd_source=8f3cf4ad6c08a40d40ca6809c9c9e8ca 高阶版运行结果展示

基于Android的家校互动系统app

需求信息&#xff1a; 功能需求: 1&#xff1a;发通知、发作业 发通知和发作业&#xff0c;是学校教师特有的功能&#xff0c;教师可以通过平台进行通知和作业的发放&#xff0c;每当发一条信息&#xff0c;该班的所有人员便可以收到来自服务器的信息推送&#xff0c;提醒家长打…

经济下行压力下的销售行业,将数据效益最大化方能立于不败之地

2022年9月&#xff0c;世界经济论坛发布《首席经济学家展望》报告&#xff0c;并指出“当前每10位经济学家中&#xff0c;就有7位认为全球经济发生了一定程度的衰退。” 在整体下行的经济环境中&#xff0c;由于销售人员会获悉客户削减预算&#xff0c;推迟采购&#xff0c;或…

mysql服务nginx和firewalld代理实现

文章目录环境准备nginx代理mysql服务linux防火墙实现mysql流量转发工作中常常遇到只有某个特定服务器才能访问数据库的情况&#xff0c;这个时候为了解决团队同时访问数据库的问题可以采用nginx代理和linux防火墙流量转发的方式解决。实战测试如下&#xff1a;环境准备 准备一…

做题关键点--位操作符

x |&#xff08;x1&#xff09;去掉从右开始的第一个0 a^a0&#xff0c;异或遵循交换律&#xff0c;即只要存在偶数个a&#xff0c;这部分结果为0. a^0a 与0异或为本身 寻找奇数_牛客题霸_牛客网 不用加减乘除做加法_牛客题霸_牛客网 二进制进行加法运算时与十进制的思路是…

Qt之QtConcurrent无需使用低级线程原语编写多线程

几个要点&#xff1a; 通过QtConcurrent::run()返回的QFuture不支持取消、暂停&#xff0c;返回的QFuture只能用于查询函数的运行/完成状态和返回值。 请注意&#xff1a;该函数可能不会立即运行; 函数只有在线程可用时才会运行。 导入模块 在 C API changes 有关于 Qt Concu…

Linux常用命令——rename命令

在线Linux命令查询工具(http://www.lzltool.com/LinuxCommand) rename 用字符串替换的方式批量改变文件名 补充说明 rename命令用字符串替换的方式批量改变文件名。 语法 rename(参数)参数 原字符串&#xff1a;将文件名需要替换的字符串&#xff1b; 目标字符串&#x…

GuLi商城-人人开源搭建前端项目

人人开源&#xff1a; 下载到本地并解压&#xff1a; VsCode打开解压好的项目&#xff1a; MAC安装Nodejs&#xff0c;略 参考&#xff1a;MAC(m1)-安装Nodejs_ZHOU_VIP的博客-CSDN博客 MAC打开终端&#xff1a; npm install类似maven下载所有的组件 报错&#xff1a; 解…

Vue基础10之插件、scoped与lang的样式

Vue基础10插件scoped与lang样式scopedlang样式安装lessless样式的使用总结插件 plugins.js: export default {install(Vue){console.log("Vue:",Vue)//全局过滤器Vue.filter(mySlice,function (value){return value.slice(0,5)})//定义全局指令Vue.directive(fbind,…

【数据结构】8.6 基数排序

文章目录基数排序定义基数排序算法基数排序算法分析基数排序定义 前述的各类排序方法都是建立在关键字啊比较的基础上&#xff0c;而分配类排序不需要比较关键字的大小&#xff0c;它是根据关键字中各位的值&#xff0c;通过对待排序记录进行若干趟分配与收集来实现排序的&…