let/const/var的区别及理解

在JavaScript中,letconst 和 var 是用来声明变量的关键字,但它们之间在作用域、变量提升、重复声明等方面存在区别,详细情况如下:

1. letconstvar 的区别

(1) 块级作用域
  • let 和 const:具有块级作用域,由 {} 包括。这解决了ES5中内层变量可能覆盖外层变量和循环变量泄露为全局变量的问题。

if(true){
    let a="hello world";
    console.log(a);//hello world
}
//console.log(a);//报错,ReferenceError: a is not defined

//因为let、const在块外部不可见

  • var:不具备块级作用域,只有函数作用域或全局作用域。

if(true){
    var b="hello world";
    console.log(b);//hello world
}
console.log(b);//hello world

//因为var声明的变量在函数作用域或全局作用域内有效
(2) 变量提升(var特有)
  • var:存在变量提升,即变量可以在声明之前使用,但值为 undefined
console.log(x); // undefined
var x = 10;

//因为var声明的变量会被提升  
  • let 和 const:不存在变量提升,必须在声明后才能使用,否则报错。
console.log(y); // 报错,ReferenceError: Cannot access 'y' before initialization
let y = 10;

//因为let、const声明的变量不会被提升  

(3) 全局属性
  • var:声明的全局变量会成为全局对象(浏览器中是 window,Node中是 global)的属性。
  • let 和 const:不会将声明的全局变量添加到全局对象的属性上。
(4) 重复声明
  • var:允许在同一作用域内重复声明变量,后声明的会覆盖前面声明的。
var c = 1;  
var c = 2;  
console.log(c); // 2
  • let 和 const:不允许在同一作用域内重复声明变量。
let d = 1;  
let d = 2; // 报错,SyntaxError: Identifier 'd' has already been declared
  
const e = 1;  
// const e = 2; // 报错

//因为let、const不允许在同一作用域内重复声明变量  
(5) 暂时性死区(let、const特有)
  • let 和 const:在声明前使用会报错,因为这段时间称为暂时性死区。
if (true) {  
    console.log(f); // 报错,因为f在声明之前处于暂时性死区  
    let f = 'temporal dead zone';  
}  
  
// const的情况与let相同,也会存在暂时性死区
  • var:不存在暂时性死区。
(6) 初始值设置
  • var 和 let:可以不设置初始值。
var g; // 未初始化 
console.log(g); // undefined  
  
let h; // 未初始化,但在使用前必须声明  
console.log(h); // undefined
  • const:必须设置初始值。
// const i; // 报错,因为const必须设置初始值  
const j = 10;  
console.log(j); // 输出 10
(7) 指针指向
  • let、var:创建的变量可以重新赋值,即可以更改指针指向。
  • const:声明的变量不允许改变指针的指向,但如果是对象或数组,可以修改其内部属性或元素。

2. const 对象的属性可以修改

const 保证的是变量指向的内存地址不变,即不能重新指向另一个对象或数组。

但对于对象或数组这样的引用类型,const 只能确保引用(指针)不变,而不能保证对象内部状态的不可变性。

因此,可以修改 const 声明的对象的属性或数组的元素。

const obj = { value: 10 };  
obj.value = 20; // 可以修改const声明对象的属性  
console.log(obj.value); // 20  
  
// obj = { value: 30 }; // 报错,因为尝试改变了const声明的对象的引用 

3.其他说明

(1)变量提升是var特有的,且只影响函数作用域或全局作用域;而暂时性死区是letconst特有的,与它们的块级作用域紧密相关。

(2)const用于声明一个只读的常量。一旦一个常量被赋值后,它的值就不能再被改变。但是,如果常量是一个对象或数组,其内部状态仍然可以被修改,只是常量指向的内存地址不能改变。使用const可以提高代码的可读性和可维护性,因为它明确表示了某些值是不应该被改变的。

(3)使用var在全局作用域中声明的变量会自动成为全局对象(在浏览器中是window,在Node.js中是global)的属性。这可能会导致意外的全局变量污染和命名冲突。所以使用letconst在全局作用域中声明的变量则不会成为全局对象的属性,这有助于减少全局命名空间的污染。

(4)由于letconst提供了更好的封装和避免命名冲突的能力,它们通常被认为是更好的选择。

总结

区别letconstvar
有无块级作用域×
有无变量提升××
能否添加全局属性××
能否重复声明变量××
有无暂时性死区×
必须设置初始值××
能否改变指针指向×

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

pico+unity3d搭建环境

分别注册pico开发者平台和unity的账号密码 下载pico的sdk和unity开发软件 创建unity3d核心项目 在项目中找到窗口,包管理器,添加磁盘的包,选中sdk 安装后就可以使用pico的操作和演示; 剩下的看文档

JVM:类加载器

文章目录 一、什么是类加载器 一、什么是类加载器 类加载器(ClassLoader)是Java虚拟机提供给应用程序去实现获取类和接口字节码数据的技术。类加载器只参与加载过程总的字节码获取并加载到内存这一部分。

中职网络安全B模块渗透测试server2380

使用nmap扫描添加参数-sV Flag:2.4.38 添加参数-A不然扫不全 (这两题可以直接加-sV -A) Flag: 4.3.11-Ubuntu 根据nmap扫描发现系统为ubuntu系统,ubuntu操作系统在某些版本中默认包含一个名为"ubuntu"的用户帐户。这是为了方…

电脑硬盘分区及合并指南

电脑硬盘分区是指将一个硬盘划分成多个独立的区域,每个区域可以被操作系统单独管理和使用,我们可以根据需要将数据分类存储,例如将系统文件、个人文件和多媒体内容分别存放在不同的分区中。合理的分区不仅可以提升系统性能,还能提…

硬盘模式vmd怎么改ahci_电脑vmd改ahci模式详细步骤

最近有很多网友问,我新买的电脑安装原版win10或win11找不到驱动器呀,进入第三方pe又找不到硬盘,找到硬盘安装后又出现安装蓝屏的情况,新机器怎么回事呀?这位网友内心有点崩溃,不知道啥原因。其实这些都是由…

洛谷P1498 南蛮图腾[递归好题]

南蛮图腾 题目背景 自从到了南蛮之地,孔明不仅把孟获收拾的服服帖帖,而且还发现了不少少数民族的智慧,他发现少数民族的图腾往往有着一种分形的效果,在得到了酋长的传授后,孔明掌握了不少绘图技术,但唯独…

金龙鱼:只是躺枪?

中储粮罐车运输油罐混用事件持续发酵,食用油板块集体躺枪。 消费者愤怒的火,怕是会让食用油企们一点就着。 今天,我们聊聊“油”茅——金龙鱼。 一边是业内人士指出,油罐混用的现象普遍存在,另一边是金龙鱼回应称&am…

【Linux】进程的基本概念(以及进程地址空间的初步了解)

目录 一.什么是进程 进程和程序的区别 Linux查看进程 进程的信息 fork函数 二.进程状态 操作系统上进程状态的概念 运行 阻塞 挂起 Linux中的进程状态 R状态 S状态和D状态 T状态 t状态 X状态 Z状态 三.进程的优先级 修改进程优先级 四.环境变量 常见的环境变量 PATH HOME PW…

谷粒商城实战-25-分布式组件-SpringCloud Alibaba-Nacos配置中心-加载多配置集

文章目录 一,拆分配置集二,配置文件中配置多配置集1,引用多配置集2,验证 三,多配置集总结1,使用场景2,优先级 这一节介绍如何加载多个配置集。 大多数情况下,我们把配置全部放在一个…

批量提取网页表格内容至excel文件

问题背景 将网页的表格内容(5237个股票信息)复制粘贴到excel文件中 网址:A股上市公司名单-A股上市公司名录-A股上市公司大全-商业计划书-可研报告-中商产业研究院数据库-中商情报网 实现代码 # 导入包 import pandas as pd import time# 创…

ATT 和 GATT:数据表示和交换

背景介绍 BLE的通信和以太网,wifi有个重大的不同是:BLE通信的设备往往有特定的功能。且这个功能不会在运行中发生变化。 因此蓝牙设备通信的时候,只能访问预先定义好的(也就是配置文件profile)的功能。 那profile里写…

Vue+SpringBoot实现仿网盘项目

目录 一、效果展示 二、前端代码 三、后端代码及核心解释 四、进阶开发与思路 一、效果展示 1.1读取文件夹内的文件 1.2删除功能 1.3 上传文件 1.4 文件下载 对应的网盘实际地址与对应下载内容: 二、前端代码 2.1 创建vue项目(需要有vuex与router&…

Spark SQL 概述

Spark SQL 概述 Spark SQL 是 Apache Spark 的一个模块,专门用于处理结构化数据。它集成了 SQL 查询和 Spark 编程的强大功能,使得处理大数据变得更加高效和简便。通过 Spark SQL,用户可以直接在 Spark 中使用 SQL 查询,或者使用 …

C++基础语法:链表和数据结构

前言 "打牢基础,万事不愁" .C的基础语法的学习 引入 链表是最基础的数据集合,对标数组.数组是固定长度,随机访问,链表是非固定长度,不能随机访问.数组查找快,插入慢;链表是插入快,查找慢. 前面推导过"数据结构算法数据集合".想建立一个数据集合,就要设计数…

Python-找客户软件

软件功能 请求代码: 填充表格: 可以search全国各个区县的所有企业信息,过滤手机号、查看是否续存/在业状态。方便找客户。 支持定-制-其他引-留-阮*件(XHSS,DYY,KS,Bi-li*Bi-li) V*…

嵌入式转行2个星期,一些真心话建议~

在开始前刚好我有一些资料,是我根据网友给的问题精心整理了一份「嵌入式的资料从专业入门到高级教程」, 点个关注在评论区回复“888”之后私信回复“888”,全部无偿共享给大家!!! 嵌入式转行2个星期&…

【计算机方向】中科院三区,国人发文占比>50%,录用容易,认可度不低~

今天小编带来计算机领域SCI快刊的解读! 如有相关领域作者有意投稿,可作为重点关注! 期刊解析 01 期刊信息 出版商:Springer Singapore ISSN:1672-6529 E-ISSN:2543-2141 期刊官方网站: https://www.sprin…

市面上值得入手的骨传导耳机怎么选?一次给你搞定全方位的选购攻略

随着骨传导耳机市场的日益发展,有很多人使用了一些不合适的骨传导耳机导致听力损伤等问题,这些问题也引起很多人日益关注的。原因大致就是,市面上出现了大量由非专业品牌贴牌和有网红生产的骨传导耳机产品,他们的核心技术的研发和…

CSDN回顾与前行:我的创作纪念日——2048天的技术成长与感悟

CSDN回顾与前行:我的创作纪念日——2048天的技术成长与感悟 💖The Begin💖点点关注,收藏不迷路💖 前言 时光荏苒,岁月如梭。转眼间,从我在CSDN上写下第一篇技术博客《2-6 带头结点的链式表操作…

寻找并可视化交互

「AI秘籍」系列课程: 人工智能应用数学基础 人工智能Python基础 人工智能基础核心知识 人工智能BI核心知识 人工智能CV核心知识 使用特征重要性、弗里德曼 H 统计量和 ICE 图分析相互作用 本文中的代码需要安装 R 语言包 药物的副作用可能取决于你的性别。吸入…