var、let、const三者之间的区别和使用

var、let、const 都是用于声明变量的关键字,可以通过作用域、可变性、变量提升几个方面进行区分;

1,作用域

1)var的属于函数作用域,只能在函数内使用。若在函数外部声明变量,会变为全局变量;

function varfun(){//函数内声明的变量,只能在函数内部调用;var a1 = '11111' if(true) { //属于块级作用域console.log(a1)   // 可以访问数据;}
}
varfun(); // 11111
console.log(a1); //报错 Uncaught ReferenceError: a1 is not defined

2)let 、const 拥有块级作用域,块级作用域是指用{}包裹的代码块,像,if、for、while等,在块级作用域声明的变量,只可以在块内访问。

function example() {if(true) {let y = 1;const z = 2;console.log(y); // 1console.log(z); // 2}console.log(y); // ReferenceError: y is not definedconsole.log(z); // ReferenceError: z is not defined
}
example()
2,变量提升:

1)var:存在变量提升的现象,变量提升表示在变量声明之前就可以访问变量,但变量值是undefind。

2)let、const不存在变量提升,在变量声明之前访问let或者const变量,会引发ReferenceError 错误。这种现象也被称作暂时性死区。

function example() {console.log(a); // undefinedconsole.log(b); // ReferenceError: Cannot access 'b' before initializationconsole.log(c); // ReferenceError: Cannot access 'c' before initializationvar a = '1'let b = '2'const c = '3'
}
example(); 
3,可变性

1)var和let 声明的变量可以重新赋值

function example() {var a = 1; let b = 2;a = 4b = 5; console.log(a, b); // 4 5
}
example(); 

2)const 一旦声明,必须初始化,并且赋值后不可以重新赋值。若const声明的是对象或者数组,对象的属性或者数组的元素是可以修改的。

function example() {const c = 3;const arr = [1, 2, 3];const obj = { name: 'John' };c = 4; //报错: TypeError: Assignment to constant variable.arr[1] = 4; // OKarr.push(5); // OKarr = [1, 8, 6]; //报错: TypeError: Assignment to constant variable.obj.name = 'Doe'; // OKobj = { name: 'Doe' }; //报错: TypeError: Assignment to constant variable.console.log(arr); // [1, 4, 3]console.log(obj); // { name: 'Doe' }
}
example(); 
4,重复声明:

1)var可以重复声明

2)let、const不可以重复声明

function example() {
//  var可以重复声明var a = 1;var a = 2;console.log(a); // 2
//  let不可以重复声明let b = 1;// let b = 2; // SyntaxError: Identifier 'b' has already been declaredconsole.log(b); // 1
//  const不可以重复声明const c = 1;// const c = 2; // SyntaxError: Identifier 'c' has already been declaredconsole.log(c); // 1if(true) {var a = 3; // 这里的a是example函数作用域let b = 4; // 这里的b是块级作用域const c = 5; // 这里的c是块级作用域console.log(a); // 3  console.log(b); // 4console.log(c); // 5}
}
example(); 
5,使用场景

1)var:鉴于其函数作用域和变量提升的特点,容易引发错误,所以现在javascript开发中,var使用频率较低,一般在旧代码或者需要兼容老版本浏览器时使用。

2)let:当需要再块级作用域中声明变量,并且后续需要重新赋值时,建议使用let。例如:for循环

3)const:变量赋值后不需要再改变时,应该使用const,可以增强代码的可读性或者可维护性;

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

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

相关文章

Consumer Group的作用是什么?Rebalance的触发条件有哪些? (实现消费者负载均衡;消费者加入/离开、订阅Topic变化等)

好的,我现在需要回答用户关于Kafka Consumer Group和Rebalance的问题。首先,用户问的是Consumer Group的作用以及Rebalance的触发条件。根据之前的对话历史,用户已经了解了Kafka的基本组件、消息保留策略、顺序性保证等,现在的问题…

出一期Source Insigned的使用教程

1. 创建新项目 打开 Source Insight,点击菜单栏的 Project > New Project。在弹出的窗口中,输入项目名称(建议与项目内容相关,便于识别)。指定项目数据文件的存储路径(即 Source Insight 配置文件保存的…

A. Row GCD(gcd的基本性质)

Problem - 1458A - Codeforces 思路: 首先得知道gcd的两个基本性质: (1) gcd(a,b)gcd(a,|b-a|) (2) gcd(a,b,c)gcd(a,gcd(b,c)) 结合题目所给的a1bj,a2bj...... anbj 根据第一条性质得到: gcd(a1bj,a2bj)gcd(…

ES6入门---第三单元 模块三:async、await

async function fn(){ //表示异步:这个函数里面有异步任务 let result await xxx //表示后面结果需要等待 } 读取文件里数据实例: const fs require(fs);//简单封装 fs封装成一个promise const readFile function (fileName){return…

如何在 C# 和 .NET 中打印 DataGrid

DataGrid 是 .NET 架构中一个功能极其丰富的组件,或许也是最复杂的组件之一。写这篇文章是为了回答“我到底该如何打印 DataGrid 及其内容”这个问题。最初即兴的建议是使用我的屏幕截图文章来截取表单,但这当然无法解决打印 DataGrid 中虚拟显示的无数行…

C语言 指针(5)

目录 1.冒泡排序 2.二级指针 3.指针数组 4.指针数组模拟二级数组 1.冒泡排序 1.1 基本概念 冒泡排序(Bubble Sort) 是一种简单的排序算法,它重复地遍历要排序的数列,一次比较两个元 素,如果它们的顺序错误就把它…

15前端项目----用户信息/导航守卫

登录/注册 持久存储用户信息问题 退出登录导航守卫解决问题 持久存储用户信息 本地存储:(在actions中请求成功时) 添加localStorage.setItem(token,result.data.token);获取存储:(在user仓库中,state中tok…

RSS 2025|斯坦福提出「统一视频行动模型UVA」:实现机器人高精度动作推理

导读 在机器人领域,让机器人像人类一样理解视觉信息并做出精准行动,一直是科研人员努力的方向。今天,我们要探讨的统一视频行动模型(Unified Video Action Model,UVA),就像给机器人装上了一个“…

基于论文的大模型应用:基于SmartETL的arXiv论文数据接入与预处理(四)

上一篇介绍了基于SmartETL框架实现arxiv采集处理的基本流程,通过少量的组件定制开发,配合yaml流程配置,实现了复杂的arxiv采集处理。 由于其业务流程复杂,在实际应用中还存在一些不足需要优化。 5. 基于Kafka的任务解耦设计 5.…

Fiori学习专题三十五:Device Adaptation

由于在类似于手机的小面板上显示时&#xff0c;我们为了留出更多空间展示数据&#xff0c;可以将一些控件折叠。 1.修改HelloPanel.view.xml&#xff0c;加入expandable“{device>/system/phone}” expanded"{ !${device>/system/phone} <mvc:ViewcontrollerNam…

【记录】HunyuanVideo 文生视频工作流

HunyuanVideo 文生视频工作流指南 概述 本指南详细介绍如何在ComfyUI中使用腾讯混元HunyuanVideo模型进行文本到视频生成的全流程操作&#xff0c;包含环境配置、模型安装和工作流使用说明。 参考&#xff1a;https://comfyui-wiki.com/zh/install/install-comfyui/install-c…

统一返回JsonResult踩坑

定义了一个统一返回类&#xff0c;但是没有给Data 导致没有get/set方法&#xff0c;请求一直报错 public class JsonResult<T> {private int code;private String message;private T data;public JsonResult() {}public JsonResult(int code, String message, T data) {…

dubbo-token验证

服务提供者过滤器 import java.util.Map; import java.util.Objects;/*** title ProviderTokenFilter* description 服务提供者 token 验证* author zzw* version 1.0.0* create 2025/5/7 22:17**/ Activate(group CommonConstants.PROVIDER) public class ProviderTokenFilt…

沃伦森电气高压动态无功补偿装置助力企业电能优化

在工业生产的复杂电能环境中&#xff0c;电能质量直接影响企业的生产效率和运营成本。XX光伏科技有限公司作为一家快速发展的制造企业&#xff0c;随着生产规模的不断扩大&#xff0c;其内部电网面临功率因数过低、电压波动频繁等问题&#xff0c;导致供电部门罚款增加、设备故…

基于EFISH-SCB-RK3576工控机/SAIL-RK3576核心板的网络安全防火墙技术方案‌(国产化替代J1900的全栈技术解析)

‌基于EFISH-SCB-RK3576/SAIL-RK3576的网络安全防火墙技术方案‌ &#xff08;国产化替代J1900的全栈技术解析&#xff09; ‌一、硬件架构设计‌ ‌流量处理核心模块‌ ‌多核异构架构‌&#xff1a; ‌四核Cortex-A72&#xff08;2.3GHz&#xff09;‌&#xff1a;处理深度…

Maven 动态版本与SNAPSHOT机制详解

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;精通Java编…

趣味编程:答案之书

概述&#xff1a;该篇博客主要介绍的是曾经一度风靡全网的答案之书小程序。 目录 1. 效果展示 2. 源码展示 3. 代码逻辑详解 3.1 头文件与全局变量 3.2 main函数 3.3 主循环 3. 4 绘制界面 4. 运行问题 5.小结 1. 效果展示 该小程序是动态的效果&#xff0c; 因此实…

多线程初阶(2)

说到多线程编程&#xff0c;一定少不了线程安全这个话题。我们前面了解了线程的原理以及线程与进程的关系。线程之间共享资源&#xff0c;这就代表了在多线程编程中一定会产生冲突&#xff0c;所以我们需要在敲代码时保证线程安全&#xff0c;避免这样的问题发生。 我们先看一…

【Ubuntu】安裝向日葵远程控制

前言 在Ubuntu 24.04.2下安装向日葵远程控制出错&#xff0c;少了一些依赖&#xff0c;需要安装一些依赖。 1.安装gconf2-common wget http://mirrors.kernel.org/ubuntu/pool/universe/g/gconf/gconf2-common_3.2.6-6ubuntu1_all.deb sudo dpkg -i gconf2-common_3.2.6-6ub…

【Python开源】深度解析:一款高效音频封面批量删除工具的设计与实现

&#x1f3b5; 【Python开源】深度解析&#xff1a;一款高效音频封面批量删除工具的设计与实现 &#x1f308; 个人主页&#xff1a;创客白泽 - CSDN博客 &#x1f525; 系列专栏&#xff1a;&#x1f40d;《Python开源项目实战》 &#x1f4a1; 热爱不止于代码&#xff0c;热情…