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.mzph.cn/web/43878.shtml

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

相关文章

百数教学秘籍:三步走,轻松规划你的自动化计划任务

通过设定任务计划,用户可以轻松安排指定的功能插件或数据助手在特定时间自动执行,有效提高工作效率,还确保了数据的及时更新和处理。任务计划在应用启动时自动启动并在后台运行,无需用户持续监控,为用户带来极大的便利…

oracle哪些后台进程不能杀?

oracle 有很多的后台进程,在遇到特殊情况的时候如锁表,如果等待的是一个后台进程,那这时就需要考量是不是能杀掉这个后台进程?杀掉这个后台进程会不会引起实例崩溃?本着实践出真知,本文针对oracle 11g&…

游戏开黑语音-使用云服务器部署teamspeak服务(系统Ubuntu 20.04 LTS)

目录 前置物品服务器调整及部署1.重装系统2.换源3.下载teamspeak服务端并部署 连接服务器参考 前置物品 一台云服务器(系统:Ubuntu 20.04 LTS) 服务器调整及部署 1.重装系统 在腾讯云官网的主机控制台内,选择重装系统 (由于之前为了快点和…

【刷题汇总 -- 最长回文子串、买卖股票的最好时机(一)、[NOIP2002 普及组] 过河卒】

C日常刷题积累 今日刷题汇总 - day0101、最长回文子串1.1、题目1.2、思路1.3、程序实现 2、买卖股票的最好时机(一)2.1、题目2.2、思路2.3、程序实现2.4、程序实现 -- 优化 3、[NOIP2002 普及组] 过河卒3.1、题目3.2、思路3.3、程序实现 -- dp 4、题目链接 今日刷题汇总 - day0…

Linux 入门教程 by 程序员鱼皮

本文作者:程序员鱼皮 免费编程学习 - 编程导航网:https://www.code-nav.cn 大家好,我是鱼皮。 前两天我学编程的老弟小阿巴过生日,我问他想要什么礼物。 本来以为他会要什么游戏机、Q 币卡、鼠标键盘啥的,结果小阿巴…

短视频矩阵:批量发布的秘密揭秘

在数字化时代,短视频已经成为一种广受欢迎的媒体形式。无论是用于品牌推广、产品营销还是个人创作,短视频都提供了一种直观、生动的方式来吸引观众的注意力。然而,有效地制作、管理和发布短视频对于许多创作者和企业来说是一个挑战。 为此&am…

什么是 C 语言中的宏定义?

🍅关注博主🎗️ 带你畅游技术世界,不错过每一次成长机会! 📙C 语言百万年薪修炼课程 通俗易懂,深入浅出,匠心打磨,死磕细节,6年迭代,看过的人都说好。 文章目…

动态规划之数字三角形模型+最长上升子序列模型

首先,我们从集合角度重新看待DP: 直接看题:https://www.acwing.com/problem/content/1029/ 就是取纸条的原题,我们令f[i1,j1,i2,j2]表示从(1,1),(1,1)分别走到(i1,j1),(i2,j2)的路径的max i1j1i2j2,于是我们可以把状…

机器学习 | 对K-Means聚类假设的研究演示及实践示例

我们在Scikit-learn对K-means假设的调查中探索了揭示算法优势和局限性的场景。我们研究了K-means对不正确的聚类大小的敏感性,它在各向异性分布中面临的困难,它在不同的聚类方差中面临的困难,以及使用合成数据集的大小不均匀的聚类问题。我们…

准备工作+1、请求和响应+2、模型和管理站点

Django快速入门——创建一个基本的投票应用程序 准备工作1、创建虚拟环境2、安装django 1、请求和响应(1)创建项目(2)用于开发的简易服务器(3)创建投票应用(4)编写第一个视图1、编写…

家用激光投影仪品牌排行榜:这几个品牌口碑好产品好最适合家用

现在人们生活水平提升,对投影这类产品的认知接受度也提升,有条件的家庭都想在家里整一个家庭影院,对于这些消费者来说挑选一台性价比高的家用投影至关重要,既省到钱又买对了产品;投影市场发展迅速目前市面上大大小小的…

mongo数据库迁移

前言 mongo数据库迁移的方式目前常见的有两种: 1,mongodump与mongorestore 2,mongoimport与mongoexport 二者主要区别有: 1、mongoexport 可以导出json和csv格式, mongodump导出的是bson可读性不如前者 2,…

在Windows 10上快速显示桌面的几种方法,总有一种适合你

序言 有时你需要在Windows 10中快速查看你的桌面,但你不想乏味地最小化每个打开的应用程序窗口,或者移动它们并丢失它们的布局。幸运的是,有几种方法可以让你快速查看桌面,然后从你停止的地方重新开始。 如何使用任务栏按钮显示桌面 假设你正在随意浏览你最喜欢的网站,…

服了,jenkins找不到advanced

新手下载的最新版本,过新手入门的时候一直过不去,就跳过了。 想下载一个汉化,还下载不了。根据提示搜索,结果大家让去advanced找url,也找不到。

FreeRTOS 队列

队列是一种任务到任务、任务到中断、中断到任务数据交流的一种机制。在队列中可以存 储数量有限、大小固定的多个数据,队列中的每一个数据叫做队列项目,队列能够存储队列项 目的最大数量称为队列的长度,在创建队列的时候,就需要指…

揭秘与应对:病毒伪装文件夹的数据恢复策略

在数字时代,数据安全是每个人不可忽视的重要议题。而伪装文件夹,作为一种狡猾的数据安全威胁,正逐渐浮出水面,成为用户需要警惕的对象。这些伪装文件夹看似普通,实则隐藏着不为人知的秘密,它们通过模仿正常…

linux系统操作/基本命令/vim/权限修改/用户建立

Linux的目录结构: 一:在Linux系统中,路径之间的层级关系,使用:/来表示 注意:1、开头的/表示根目录 2、后面的/表示层级关系 二:在windows系统中,路径之间的层级关系,使用:\来表示 注意:1、D:表示…

移动应用性能收集工具原理解析

性能收集分析相关工具总览 收集、分析、展示移动应用性能数据的工具很多,大致可以分为如下几类。例如可收集多项性能指标的移动性能工具,perfdog,Solopi,其中Solopi开源,pefdog商业工具。可进行Crash分析的工具&#x…

猫超卡怎么使用?

天猫超市卡好像只能买天猫的东西 但是有时候淘宝、京东打折比天猫的单价还便宜 这样的话,猫超卡好像也没多大用处 这不,上个月618凑单的东西比在天猫超市买划算多了 最后我直接把猫超卡在收卡云上折现了,超划算

编程学单词:delta(希腊字母Δ/δ)

希腊字母表的第四个字母,大写为Δ,小写为δ。 (笔记模板由python脚本于2024年07月11日 12:32:56创建,本篇笔记适合喜欢写代码,更喜欢鼓捣Python的coder翻阅) 【学习的细节是欢悦的历程】 Python 官网:https://www.pyth…