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 declaredconst 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
有无块级作用域×
有无变量提升××
能否添加全局属性××
能否重复声明变量××
有无暂时性死区×
必须设置初始值××
能否改变指针指向×

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

记录些Redis题集(2)

Redis 的多路IO复用 多路I/O复用是一种同时监听多个文件描述符(如Socket)的状态变化,并能在某个文件描述符就绪时执行相应操作的技术。在Redis中,多路I/O复用技术主要用于处理客户端的连接请求和读写操作,以实现高并发…

Redis 中String类型操作命令(命令演示,时间复杂度,返回值,注意事项)

String 类型 文章目录 String 类型set 命令get 命令mset 命令mget 命令get 和 mget 的区别incr 命令incrby 命令decr 命令decrby 命令incrbyfloat 命令append 命令getrange 命令setrange 命令 字符串类型是 Redis 中最基础的数据类型,在讲解命令之前,我们…

STM32基础篇:EXTI × 事件 × EXTI标准库

EXTI EXTI简介 EXTI:译作外部中断/事件控制器,STM32的众多片上外设之一,能够检测外部输入信号的边沿变化并由此产生中断。 例如,在检测按键时,按键按下时会使电平产生翻转,因此可以使用EXTI来读取按下时…

用AirScript脚本给女/男朋友发送每日早安邮件(极简版本)

先看效果 工具 金山文档/WPS提供了每日定时的AirScript脚本服务,非常方便~ 话不多说,我们以金山文档为例,只有简单的五个步骤,非常容易~ 教程开始 步骤1 我们打开金山文档新建一个智能表格 步骤2 按下图…

基于Python thinker GUI界面的股票评论数据及投资者情绪分析设计与实现

1.绪论 1.1背景介绍 Python 的 Tkinter 库提供了创建用户界面的工具,可以用来构建股票评论数据及投资者情绪分析的图形用户界面(GUI)。通过该界面,用户可以输入股票评论数据,然后通过情感分析等技术对评论进行情绪分析…

【Linux网络】IP协议{初识/报头/分片/网段划分/子网掩码/私网公网IP/认识网络世界/路由表}

文章目录 1.入门了解2.认识报头3.认识网段4.路由跳转相关指令路由 该文诸多理解参考文章:好文! 1.入门了解 用户需求:将我的数据可靠的跨网络从A主机送到B主机 传输层TCP:由各种方法(流量控制/超时重传/滑动窗口/拥塞…

【JavaEE】网络编程——TCP

🤡🤡🤡个人主页🤡🤡🤡 🤡🤡🤡JavaEE专栏🤡🤡🤡 文章目录 前言1.网络编程套接字1.1流式套接字(TCP)1.1.1特点1.1.2编码1.1.2.1ServerSo…

微信小游戏 彩色试管 倒水游戏 逻辑 (二)

最近开始研究微信小游戏,有兴趣的 可以关注一下 公众号, 记录一些心路历程和源代码。 定义一个 Water class 1. **定义接口和枚举**: - WaterInfo 接口定义了水的颜色、高度等信息。 - PourAction 枚举定义了水的倒动状态,…

【Nuxt3】vue3+tailwindcss+vuetify引入自定义字体样式

一、目的 在项目中引入自定义的字体样式(全局页面都可使用) 二、步骤 1、下载好字体 字体的后缀可以是ttf、otf、woff、eot或者svg(推荐前三种) 以抖音字体为例下载好放在静态文件夹(font)下 案例字…

数学建模入门

目录 文章目录 前言 一、数学建模是什么? 1、官方概念: 2、具体过程 3、适合哪一类人参加? 4、需要有哪些学科基础呢? 二、怎样准备数学建模(必备‘硬件’) 1.组队 2.资料搜索 3.常用算法总结 4.论文撰写的…

【密码学】数字签名

一、数字签名的基本概念 数字签名是一种用于验证电子文档完整性和身份认证的密码学技术。它通过使用公钥加密体系中的私钥对文档的一部分(通常是文档的摘要)进行加密,从而创建一个“签名”。这个签名可以附在文档上,或作为一个单独…

【数据结构】--- 堆的应用

​ 个人主页:星纭-CSDN博客 系列文章专栏 :数据结构 踏上取经路,比抵达灵山更重要!一起努力一起进步! 一.堆排序 在前一个文章的学习中,我们使用数组的物理结构构造出了逻辑结构上的堆。那么堆到底有什么用呢&…

【Linux】01.Linux 的常见指令

1. ls 指令 语法:ls [选项] [目录名或文件名] 功能:对于目录,该命令列出该目录下的所有子目录与文件。对于文件,将列出文件名以及其他信息 常用选项: -a:列出当前目录下的所有文件,包含隐藏文件…

Spring webflux基础核心技术

一、 用操作符转换响应式流 1 、 映射响应式流元素 转换序列的最自然方式是将每个元素映射到一个新值。 Flux 和 Mono 给出了 map 操作符&#xff0c;具有 map(Function<T&#xff0c;R>) 签名的方法可用于逐个处理元素。 当操作符将元素的类型从 T 转变为 R 时&#xf…

「豆包Marscode体验官」我用豆包Marscode画数据大屏

认识豆包Marscode 豆包 MarsCode IDE 是一个 AI 原生的云端集成开发环境&#xff08;IDE&#xff09;。内置的 AI 编程助手和开箱即用的开发环境让我们可以更加专注于各种项目的开发。豆包 MarsCode 编程助手&#xff0c;具备以智能代码补全为代表的 AI 功能。支持了多种编程语…

【学习笔记】无人机(UAV)在3GPP系统中的增强支持(十二)-无人机群在物流中的应用

引言 本文是3GPP TR 22.829 V17.1.0技术报告&#xff0c;专注于无人机&#xff08;UAV&#xff09;在3GPP系统中的增强支持。文章提出了多个无人机应用场景&#xff0c;分析了相应的能力要求&#xff0c;并建议了新的服务级别要求和关键性能指标&#xff08;KPIs&#xff09;。…

解读网传《深圳IT圈⭕新解读八小时工作制》

网传深圳IT圈的新解读八小时工作制 工作时间安排&#xff1a; 10:00-12:0014:00-18:0019:00-21:00 初看&#xff1a;有惊喜 上午开始时间晚&#xff1a;相对于传统的9点开始&#xff0c;这种安排允许员工有更多的早晨时间&#xff0c;可以用来休息或处理个人事务。下午和晚上分…

Amazon EC2 部署Ollama + webUI

最近和同事闲聊&#xff0c;我们能不能内网自己部署一个LLM&#xff0c;于是便有了Ollama webUI的尝试 对于Linux&#xff0c;使用一行命令即可 curl -fsSL https://ollama.com/install.sh | shollama --help Large language model runnerUsage:ollam…

架构设计-NX的二次开发API架构设计介绍

1.与整体的关系 2.API设计目标 能够允许用户访问NX的所有UI工具组件&#xff0c;二次开发用户能够编写外观和运行行为类似NX的应用程序。能够允许用户直接访问NX数据模型即使底层数据结构和功能实现发生很大变化&#xff0c;API接口保持稳定&#xff0c;不会影响上层用户。 3…

智能家居开发新进展:乐鑫 ESP-ZeroCode 与亚马逊 ACK for Matter 实现集成

日前&#xff0c;乐鑫 ESP-ZeroCode 与亚马逊 Alexa Connect Kit (ACK) for Matter 实现了集成。这对智能家居设备制造商来说是一项重大进展。开发人员无需编写固件或开发移动应用程序&#xff0c;即可轻松设计符合 Matter 标准的产品。不仅如此&#xff0c;开发者还可以在短短…