let/const/var的区别及理解

news2024/9/19 10:57:36

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

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

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

相关文章

系统服务综合项目

要求: 现有主机 node01 和 node02,完成如下需求: 1、在 node01 主机上提供 DNS 和 WEB 服务 2、dns 服务提供本实验所有主机名解析 3、web服务提供 www.rhce.com 虚拟主机 4、该虚拟主机的documentroot目录在 /nfs/rhce 目录 5、该目录由 no…

前端JS特效第29波:jQuery鼠标经过星星显示特效

jQuery鼠标经过星星显示特效&#xff0c;先来看看效果&#xff1a; 部分核心的代码如下&#xff1a; <!doctype html> <html lang"zh"> <head> <meta charset"UTF-8"> <meta http-equiv"X-UA-Compatible" content&q…

TomCat服务器安装和配置教程

1.TomCat下载路径 TomCat官方网站&#xff1a;http://tomcat.apache.org 前往该网站下载安装tomcat&#xff0c;tar.gz文件是Linux操作系统的安装版本&#xff0c;zip文件是 windows操纵系统的压缩版本 打开后是如下网站&#xff0c;请下载匹配的操作系统的文件并且选择合适的…

Selenium原理深度解析

在自动化测试领域&#xff0c;Selenium无疑是最受欢迎和广泛使用的工具之一。它支持多种浏览器和操作系统&#xff0c;为开发人员和测试人员提供了强大的自动化测试解决方案。本文将深入探讨Selenium的工作原理&#xff0c;包括其架构、核心组件、执行流程以及它在自动化测试中…

IGBT功率半导体的主要用途及全球知名厂商

功率半导体作为现代电子电力系统的核心组件&#xff0c;其技术的不断发展和创新对于提高能源利用效率、推动新能源产业发展以及实现工业自动化和智能化具有重要意义。 IGBT功率模块市场预测 近年来&#xff0c;IGBT功率半导体的热度持续攀升。据QYResearch调研团队最新报告“全…

探索Facebook在人工智能领域的最新进展

在当今快速发展的科技领域中&#xff0c;人工智能&#xff08;AI&#xff09;作为一项关键技术&#xff0c;正在逐步改变着社交媒体的面貌。作为全球最大的社交平台之一&#xff0c;Facebook积极探索和应用人工智能&#xff0c;以提升用户体验、增强平台安全性并推动技术创新。…

SPE连接器技术革新汽车制造业

概述 新的SPE标准在汽车制造业中的应用正日益受到重视&#xff0c;它不仅推动了汽车通信技术的革新&#xff0c;还对汽车性能测试方法产生了深远影响。本文将详细探讨SPE标准在汽车制造业中的应用案例分析&#xff0c;以及它对供应链的挑战与机遇。 SPE标准在汽车制造业中的应…

pico+unity3d搭建环境

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

GaussDB关键技术原理:高性能(四)

GaussDB关键技术原理&#xff1a;高性能&#xff08;三&#xff09;从查询重写RBO、物理优化CBO、分布式优化器、布式执行框架、轻量全局事务管理GTM-lite等五方面对高性能关键技术进行了解读&#xff0c;本篇将从USTORE存储引擎、计划缓存计划技术、数据分区与分区剪枝、列式存…

透视数据治理:企业如何衡量数据治理的效果?

在企业运营中&#xff0c;各个业务部门的成功与否都是直观且易于量化的&#xff0c;像销售部门卖了多少产品又为企业带来多少盈利&#xff0c;这些都能用具体的数字来说话。但当谈到数据治理的成效时&#xff0c;许多企业与决策者却感到迷茫。 数据治理的重要性不言而喻&#…

画了一个简陋的曼德勃罗集

原文画了一个简陋的曼德勃罗集 - 知乎 (zhihu.com) 前两天看妈咪叔科普曼德勃罗集的视频&#xff1a; 【分形与混沌2】最有魅力的几何图形——曼德勃罗集与朱利亚集 天使与魔鬼共存_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili​www.bilibili.com/video/av79113074​编辑 虽然看过…

springboot3 集成GraalVM

目录 安装GraalVM 配置环境变量 Pom.xml 配置 build包 测试 安装GraalVM Download GraalVM 版本和JDK需要自己选择 配置环境变量 Jave_home 和 path 设置setting.xml <profile><id>graalvm-ce-dev</id><repositories><repository><id&…

linux 0.11 中的重要的全局变量

通过对全局变量的了解&#xff0c;也有助于了解整个代码的逻辑。就跟学习类一样&#xff0c;了解类有哪些成员变量&#xff0c;也有助于了解类的成员函数的功能。 &#xff08;1&#xff09;内存初始化相关 static u_char mem_map [ PAGING_PAGES ] { 0 , } .本数组对 1M 以外…

C++模板总结

文章目录 写在前面1. 函数模板1.1 函数模板的概念1.2 函数模板的原理1.3 函数模板的实例化1.4 函数模板的实例化模板参数的匹配原则 2. 类模板3. 非类型模板参数4. 模板的特化4.1 概念4.2 函数模板特化4.3 类模板特化 5. 模板分离编译6. 总结 写在前面 进入C以后&#xff0c;C…

Unity自定义场景背景图片

Unity自定义场景背景图片 1.更改图片材质 2.新建空对象并进行组件的添加、图层的设置 3.隐藏图层 4.对原有摄像机进行设置 5.新建摄像机&#xff0c;并进行设置 6.对步骤2新建的空物体大小进行设置&#xff0c;直至铺满整个屏幕

自学鸿蒙HarmonyOS的ArkTS语言<六>警告弹窗AlertDialog和列表选择弹窗ActionSheet

一、警告弹窗 ... Button(点击我可以获取一个警告弹窗).onClick(() > {AlertDialog.show({title: 我是弹窗标题,subtitle: 我是副标题,message: 我是弹窗内容,autoCancel: true, // 点击遮罩层是否关闭alignment: DialogAlignment.Center, // 弹窗位置offset: { dx: 0, dy:…

sed -i会破坏软连接

一、【写在前面】 开门见山&#xff0c;通过 sed - i 修改软连接指向的文件会破坏软连接 最近在管理本人的ansible项目的时候&#xff0c;发现了这个问题 二、【问题说明】 这是一个原本的软连接&#xff0c;码有点多&#xff0c;但是可以看出来指向了一个ini文件 然后我们…

Linux-Cgroup V2 初体验

本文主要记录 Linux Cgroup V2 版本基本使用操作&#xff0c;包括 cpu、memory 子系统演示。 1. 开启 Cgroup V2 版本检查 通过下面这条命令来查看当前系统使用的 Cgroups V1 还是 V2 stat -fc %T /sys/fs/cgroup/如果输出是cgroup2fs 那就是 V2&#xff0c;就像这样 roott…

AIGC产品经理学习路径

基础篇&#xff08;课时 2 &#xff09; AIGC 行业视角 AIGC 的行业发展演进&#xff1a;传统模型/深度学习/大模型 AIGC 的产品设计演进&#xff1a;AI Embedded / AI Copilot / AI Agen AIGC 的行业产业全景图 AIGC 的产品应用全景图 AIGC 职业视角 AI 产品经理/ AIGC…