let const var区别

news2025/2/25 6:47:10

文章目录

      • 写在前面
      • 1.var关键字
        • 1.1 没有块级作用域的概念,有全局作用域、函数作用域的概念
        • 1.2 存在变量提升
        • 1.3 全局作用域用var声明的变量会挂载到window对象上
        • 1.4 同一作用域中允许重复声明
        • 1.5 不初始化值默认为undefined
      • 2.let关键字
        • 2.1 有块级作用域的概念
        • 2.2 不存在变量提升
        • 2.3 同一作用域内不允许重复声明
        • *2.4 暂时性死区(dead zone)
      • 3.const关键字
        • 3.1 创建后必须立即初始化,不能留到以后赋值
        • *3.2 创建常量
          • 3.2.1 es5实现创建常量
          • 3.2.1 实现const创建的引用类型为常量

写在前面

该格式的文字为个人理解,纯大白话

文章标题前加* 代表该知识点为不好理解或容易遗漏的知识点

1.var关键字

1.1 没有块级作用域的概念,有全局作用域、函数作用域的概念

例1:

//Global Scope
{
  var a = 10;
}
console.log(a);  //10

在大括号内部声明a,在大括号外部仍然可以访问,由此可以看出var声明的变量不存在块级作用域(Block Scope)的概念

例2:

//Global Scope
var a = 10;
function checkscope(){
    //Local Scope
    var b = 20;
    console.log(a);  //10
    console.log(b);  //20
}
checkscope();
console.log(b);  //ReferenceError: b is not defined

上面代码中,在 Global Scope 中用 var 声明了 a,在 checkscope 函数中的 Local Scope(本地作用域、函数作用域)中打印出了 10,但是在 Global Scope 中打印的变量 b 报错了。

在全局中声明了a,存在全局作用域中,函数(checkscope)内部也可以访问。在函数(checkscope)内部声明的变量,仅存在与函数内部作用域中,函数外无法访问

1.2 存在变量提升

例3:

//Global Scope
console.log(a);  //undefined
var a = 10;

checkscope();
function checkscope(){
    //Local Scope
    console.log(a);  //undefined
    var a;
}

先打印了a,然后用var声明变量a,打印结果为undefined。
变量提升是因为js需要经理编译和执行阶段。js在编译阶段的时候,会搜集所有的变量声明并且提前声明变量

1.3 全局作用域用var声明的变量会挂载到window对象上

//Global Scope
var a = 10;
console.log(a);  //10
console.log(window.a);  //10
console.log(this.a);  //10

上面代码中,打印出了 310,访问 awindow.a 或是 this.a 都是等价的。
举个例子:比如我要访问 location 对象,使用 location 可以访问,使用 window.location 也可以访问,只不过 window 对象可以省略不写,就像 new Array( )new window.Array( ) 是等价的。

1.4 同一作用域中允许重复声明

//Global Scope
var a = 10;
var a = 20;
console.log(a);  //20

checkscope();
function checkscope(){
    //Local Scope
    var b = 10;
    var b = 20;
    console.log(b);  //20
}

上面代码中,在 Global Scope 中声明了 2a,以最后一次声明有效,打印为 20。同理,在 Local Scope 也是一样的。

1.5 不初始化值默认为undefined

//Global Scope
var a;
console.log(a);  //undefined

Global Scope 中用 var 声明了 a,但没有初始化值,它的值默认为 undefined
这里是 undefinedundefined 类型,而不是字符串。

2.let关键字

2.1 有块级作用域的概念

{
   //Block Scope
   let a = 10;
}
console.log(a);  //ReferenceError: a is not defined

在大括号内声明的变量,在大括号外无法被访问

2.2 不存在变量提升

 console.log(a);  // Uncaught ReferenceError: a is not defined
  let a = 10;

上面代码中,打印 a 报错:无法在初始化之前访问。说明不存在变量提升。

2.3 同一作用域内不允许重复声明

{
  //Block Scope
  let A;
  var A;  //SyntaxError: Identifier 'A' has already been declared
}
{
  //Block Scope
  var A;
  let A;  //SyntaxError: Identifier 'A' has already been declared
}
{
  //Block Scope
  let A;
  let A;  //SyntaxError: Identifier 'A' has already been declared
}

*2.4 暂时性死区(dead zone)

在作用域内第一行到使用let、const声明语句之间,存在暂时性死区,访问该变量就会报错。

ECMAScript2015文档中的解释:
当程序的控制流程在新的作用域(module、functionblock 作用域)进行实例化时,在此作用域中用 let/const 声明的变量会先在作用域中被创建出来,但因此时还未进行词法绑定,所以是不能被访问的,如果访问就会抛出错误。因此,在这运行流程进入作用域创建变量,到变量可以被访问之间的这一段时间,就称之为暂时死区。

个人理解:let/const 命令会使区块形成封闭的作用域,在此作用域中,let/const* 声明的变量会先在作用域中被创建,一直到变量被声明之前,该变量都是不可用的,访问就会报错。在语法上称为 “暂时性死区”temporal dead zone,简称 TDZ

if (true) {
  //暂时性死区(TDZ)开始
  console.log(a);  //ReferenceError: Cannot access 'a' before initialization

  let a; //暂时性死区(TDZ)结束
  console.log(a);  //undefined

  a = 123;
  console.log(a);  //123
}

例4:

{
  //Block Scope
  console.log(a);  //ReferenceError: Cannot access 'a' before initialization
  let a = 20;
}

专属报错:初始化之前无法访问
在这里插入图片描述
区别:

这里的暂时性死区存在于块级作用域中,若在全局作用域中,则报错‘is not defined’

在这里插入图片描述

3.const关键字

const除了具有以上let中的四种特性(存在块级作用域、不存在变量提升、同一作用域内不允许重复声明、存在暂时性死区)之外,还有以下特点:

3.1 创建后必须立即初始化,不能留到以后赋值

在这里插入图片描述
const 声明的变量 a 没有进行初始化,所以报错。

*3.2 创建常量

const创建常量的特点:

const实际上保证的并不是变量的值不得改动,而是变量指向的那个内存地址不得改动。
对于简单类型的数据(数值、字符串、布尔值)而言,值就保存在变量指向的内存地址中,因此等同于常量。但对于复合类型的数据(主要是对象和数组)而言,变量指向的内存地址保存的只是一个指针,const只能保证这个指针是固定的,至于它指向的数据结构是不是可变的,这完全不能控制。

例5:
在这里插入图片描述

const 创建的变量的内存地址不可改变,而对于简单的数据类型,值就存在于变量指向的内存地址中,所有a的值不可以改变
例6:
在这里插入图片描述
对于复杂的数据类型,内存地址中保存的是一个指针,const只能保证这个指针是固定的,指针指向的数据结构是可以改变的

3.2.1 es5实现创建常量

Object.defineProperty
三个参数:

  1. 属性所在的对象
  2. 属性的名字
  3. 一个描述符对象:
    • configurable:表示能否通过delete删除属性从而重新定义属性,能否修改属性的特性,或者能否把属性修改为访问器属性,默认值为false。
    • enumerable:表示能否通过for in循环访问属性,默认值为false
    • writable:表示能否修改属性的值。默认值为false。
    • value:包含这个属性的数据值。默认值为undefined。

实现:

Object.defineProperty(window,"args",{
value: ' this is es5',
writable: false
})

报错:常量变量赋值
在这里插入图片描述

3.2.1 实现const创建的引用类型为常量
const obj={
 id:1,
 age:18,
 name:'aaa'
}

obj.age=19       // cosnt 创建一个对象,对象中的属性可以被改变

追问1:如何使对象中的属性不可改变
解决:使用Object.freeze(),冻结对象,一个被冻结的对象再也不能被修改

const obj2={
 id:2,
 name:'bbb',
 age:20,
 food:['banana','apple']
}
Object.freeze(obj2)

obj2.age=21                 //被Object.freeze()冻结后,不可以改变    
obj2.foods[1]='pear'        //可以改变  freeze只能冻结根层 嵌套引用类型需要嵌套递归

解决:实现创建引用类型
思路:使用递归,将每一层的引用类型冰冻,实现创建引用类型的常量。

   function deepFreeze(obj) {
            Object.freeze(obj);
            (Object.keys(obj) || []).forEach((key) => {
                let innerObj = obj[key]
                if (typeof innerObj === 'object') {
                    deepFreeze(innerObj);
                }
            }
            )
        }


        const tempObj = {
            id: 23,
            name: '1',
            food: ['banana', 'apple']
        }
        deepFreeze(tempObj)

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

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

相关文章

HTB靶机:RainyDay

目录介绍主机信息探测网站探测子域名爆破(BurpSuite)目录爆破爆破参数值分析 & 破解hash登录系统反弹shell端口转发内网穿透【很坑】配置socks代理内网扫描换用windows做内网渗透子域名信息收集爆破密钥位置爆破密钥内容JWT攻击进程监控Flag1 & 获取SSH私钥提权python沙…

UE4 通过按键切换不同的HUD

咱们在玩游戏的时候,通常会和界面进行各种各样的互动,而且会动都是在不同的界面上,所以需要在不同的界面上进行切换或者多个HUD重叠显示在一起。 首先创建两个HUD 2.重新定义一个PlayerController类 // Fill out your copyright notice…

被裁后半月面试8家公司无果,凭借这份Java面试指南成功入职阿里

前言 上个月班上的好好的突然被通知"毕业了",现在工作也确实不好找。之前近一个月面了很多大大小小的公司降薪太严重都没考虑去,最后没办法本来都打算随便去一家了却偶然得到一个阿里的面试机会,足足面了七面(我太难了…

前有刘德华,后有腾格尔和光头李进,明星为何都热衷于线上演唱会

2022年11月19日,有着“草原歌神”之称的腾格尔,开启了自己的线上演唱会,并且取得了圆满的成功。其实在此之前,天王刘德华已经在某音平台,两次开启自己的线上演唱会,都受到了非常好的效果。 为什么音乐领域的…

手把手教你定位线上MySQL锁超时问题,包教包会

昨晚我正在床上睡得着着的,突然来了一条短信。 ​什么?线上的订单无法取消! 我赶紧登录线上系统,查看业务日志。 ​发现有MySQL锁超时的错误日志。 不用想,肯定有另一个事务正在修改这条订单,持有这条订单的…

【边缘注意:深度多尺度特征】

Learning a Deep Multi-Scale Feature Ensemble and an Edge-Attention Guidance for Image Fusion (学习深度多尺度特征集成和图像融合的边缘注意指南) 在本文中,我们提出了一种用于红外和可见光图像融合的深度网络,该网络将具…

带你了解什么是Java虚拟机运行时数据区

一、前言 程序都是运行在内存里的,所以对于一门开发语言来说,对于内存的管理都是重中之重的,前有C、C需要开发者管理内存,后有Java的自动内存管理,到如今的内存安全的Rust。 二、运行时数据区概览 Java虚拟机在运行…

PyQt5可视化编程-菜单和工具栏

一、简介 PyQt5 是Digia的一套Qt5与python绑定的应用框架,同时支持2.x和3.x。本教程使用的是3.x。Qt库由Riverbank Computing开发, 是最强大的GUI库之一 ,官方网站:www.riverbankcomputing.co.uk/news。 PyQt5是由一系列Python模块…

Allegro上如何让飞线以方框形式显示

Allegro上如何让飞线以方框形式显示 Allegro可以让飞线以方框形式显示,让走线评估更简单,尤其是电源和地,如下图 选择Edit-Property Find选择Nets 选择需要改成方框显示的网络,左边选择Voltage,Value里面输入任意一个数字,比如0或者1,apply 可以看到网络已经显示成…

八.调试的技巧

目录 一.调试 1.何为调试? 2.调试的基本步骤 二.debug和release的介绍 三.Windows环境调试介绍 1.调试环境准备 2.学会快捷键 (1)F5 (2)F9 (3)F10 (4)F11 &am…

【Java学习】JavaWeb ---- JDBC

文章目录JDBC 快速入门ResultSet数据连接池JDBC 快速入门 下载jar包(百度)->add as library 代码 package com.ith.jdbc;import java.sql.Connection; import java.sql.DriverManager; import java.sql.Statement;public class demo1 {public stati…

HTTPS一定安全吗

https是一种通过计算机网络进行安全通信的传输协议,主要目的是提供对网站服务器的身份认证,保护交换数据的隐私与完整性,但不能说使用htttps就一定绝对的安全。 有一点需要了解的是,使用HTTPS 在内容传输的加密上使用的是对称加密…

使用dreamweaver制作采用DIV+CSS进行布局——美食甜品店铺加盟企业HTML静态网页 ——学生美食网页设计作品静态HTML网页模板源码

👨‍🎓静态网站的编写主要是用HTML DIVCSS JS等来完成页面的排版设计👩‍🎓,常用的网页设计软件有Dreamweaver、EditPlus、HBuilderX、VScode 、Webstorm、Animate等等,用的最多的还是DW,当然不同软件写出的…

C++标准库分析总结(九)——<适配器>

目录 1 适配器简介 2 适配器使用分类 2.1 容器适配器 2.2 函数适配器 2.2.1 常见的函数适配器 2.2.2 bind2nd 2.2.3 not1 2.2.4 bind用法 2.3 迭代器适配器 2.4 X适配器 1.6.1 ostream_iterator 1.6.2 istream_iterator 1 适配器简介 把一个原本存在的东西&#xf…

递归和排序算法的应用

一、递归常见问题和注意事项 1. 堆栈溢出; 2. 警惕重复运算: 可以使用一个数据结构(散列表)将已经计算过的f(k)保存起来,每当调用到f(k)时,先产看下是否已经求结果,从而避免重复计算。 3. 将递…

【嵌入式Linux】5.Ubuntu 交叉编译工具链安装

前言 交叉编译器中“交叉”的意思就是在一个架构上编译另外一个架构的代码,相当于两种架构“交叉”起来了。 其基本特点是: 1、它肯定是一个 GCC 编译器。 2、这个 GCC 编译器是运行在 X86 架构的 PC 上的。 3、这个 GCC 编译器是编译 ARM 架构代码的,也就是编译出来的可…

MongoDB 的安装、启动与连接

MongoDB 的安装、启动与连接一、MongoDB Community Server1. 安装(1) 下载(2) 安装1) 解压2) 配置环境变量3) 配置数据库存放目录a. 创建b. 赋权2. 启动验证二、MongoDB Compass安装三、连接一、MongoDB Community Server 1. 安装 (1) 下载 官网下载安装 (2) 安装 1) 解压…

three.js之访问几何体数据与几何体的旋转平移

文章目录访问几何体数据简介例子BoxGeometryPlaneBufferGeometry旋转、缩放、平移变换注意专栏目录请点击 访问几何体数据 简介 一般我们在开发项目的时候,可能会加载外部模型,这个时候,我们就需要获取到几何体的顶点数据这个时候&#xff…

Kubernetes入门

文章目录1、K8s快速入门1)简介2)架构(1)整体主从方式(2)master节点架构(3)Node节点架构3)概念4)快速体验(1)安装minikube(…

商城项目环境准备 — docker安装elasticsearch

文章目录一、操作系统虚拟内存设置为262144二、拉取elasticsearch镜像三、创建docker容器挂载的目录四、设置挂载文件访问权限五、启动elasticsearch六、访问一、操作系统虚拟内存设置为262144 原因:系统虚拟内存默认最大映射数为65530,无法满足ES系统要…