在JavaScript开发中,关于var、let和const你需要知道这些

文章目录

  • 📋前言
  • 🎯var
  • 🎯let
  • 🎯const
  • 🎯相关面试题
  • 📝总结


📋前言

计算机编程中最基本的一个就是使用名字(或标识符)表示值。绑定名字和值为我们提供了一种引用值和在程序中使用值的方式,对于绑定名字和值,我们通常会说把值赋给变量。术语“变量”意味着可以为其赋予新值,也就是说与变量关联的值在程序运行时可能发生变化。如果把一个值永久地赋予给一个名字。那么可以称该名字为常量而不是变量。(来自犀牛书变量声明与赋值)

在JavaScript中使用变量或常量前,必须先声明它。在ES6之前,我们是通过 var 关键字来声明变量的,在ES6之后,我们可以通过 letconst 关键字来完成声明。


🎯var

1️⃣ var 是 JavaScript 早期版本中最常见的变量声明方式,它可以在全局作用域和函数作用域中使用。使用 var 声明的变量具备变量提升的特性,但是在没有赋值的情况下,其默认值为 undefined。

📝我们看下面这段代码,会输出什么呢?没错输出的是undefined。

function getNumber(isNumber) {
  if (isNumber) {
    var num = "7";
  } else {
    var notNum = "not number!";
    console.log(num);
  }
}
getNumber(false);

在这里插入图片描述
因为在 JavaScript 中有一个提升机制,就是无论你在哪里使用 var 关键字声明变量,它都会被提升到当前作用域的顶部。在运行 getNumber 函数时,实际上执行结构是下面这个样子。

function getNumber(isNumber) {
  var num;
  var notNum;
  if (isNumber) {
    num = "7";
  } else {
    notNum = "not number!";
    console.log(num);
  }
}
getNumber(false);

因为在开头定义变量时,没有给 num 变量赋任何值,并且 getNumber 传入的是 false,导致 if 语句未执行,num 未被赋值,所以控制台输出 undefined。

2️⃣ var 声明的变量可以被重复定义,这意味着可以在同一作用域内多次声明同一个变量,而不会报错。但是,如果 var 定义的变量在全局作用域中声明,则有可能会覆盖掉某些全局变量,造成不必要的麻烦。

📝如下面这段代码就很麻烦了,会造成环境卡死。

function Sum(arrList) {
  var sum = 0;
  for (var i = 0; i < arrList.length; i++) {
    var arr = arrList[i];
    for (var i = 0; i < arr.length; i++) {
      sum += arr[i];
    }
  }
  return sum;
}
var arr = [1, 2, 3, 4, 5];
document.write(Sum(arr));

这是因为在两层 for 循环中我们使用同一变量 i 进行赋值时,代码在执行过程中,第二层的 for 循环会覆盖外层变量 i 的值。

3️⃣ 由于 var 存在变量提升的问题,所以它有可能会引起一些奇怪的问题。比如,在循环体内使用 var 定义的变量(如上述代码),可能会因为变量提升而影响到其他的循环体。

📝补充:使用 var 关键字定义的变量只有两种作用域,全局作用域和函数作用域,两者均不是块结构,会造成变量声明的提升。这可能出现下面这种问题:

function func() {
  for (var i = 0; i < 5; i++) {}
  console.log(i); // 5
}
func();

在这里插入图片描述
运行上述代码后,你会发现页面上会显示 5。我们虽然是在 for 循环中定义的 i 变量,但由于变量被提升到 for 语句之上,所以退出循环后,变量 i 并没有被销毁,我们能够在循环外获取它的值。


🎯let

1️⃣let 是 ES6 中新增的一种变量声明方式,它主要用于声明块级作用域中的变量。使用 let 声明的变量不存在变量提升的问题,因此不能在声明之前使用变量。let 声明的变量不能被重复定义,如果在同一个作用域内多次声明同一个变量,会报错。

📝我们看下面这段代码会输出什么呢?

function getNumber(isNumber) {
  if (isNumber) {
    let num = "7";
  } else {
    let notNum = "not number!";
    console.log(num);
  }
}
getNumber(false);

在这里插入图片描述
ReferenceError 是一个引用类型的错误,num is not defined 意思是 num 变量并不存在。

let 关键字声明变量,其作用域是一个块,如果我们是在花括号 {} 里面声明变量,那么变量会陷入暂时性死区,也就是在声明之前,变量不可以被使用。

在上面代码中,我们的 num 变量是放在 if(){} 这个块中,并没有在 else{} 块中,所以会形成暂时性死区。
在这里插入图片描述
虽然 let 关键字声明的变量可以重新赋值,但是它与 var 关键字有所不同,let 关键字不能在同一作用域内重新声明,而 var 可以。

let i = 5;
let i = 6;
console.log(i);

可以看到控制台会报参数错误(SyntaxError)。
在这里插入图片描述
如果将上面代码中的 let 关键字改为 var 关键字便不会报错了。

var i = 5;
var i = 6;
console.log(i);

在这里插入图片描述

2️⃣ let 声明的变量具备块级作用域,这意味着它们只在相应的代码块中存在,超出该块范围时就会被销毁。在循环体内使用 let 定义变量,则可以避免使用 var 带来的问题。

function func() {
  for (let i = 0; i < 5; i++) {}
  console.log(i);
}
func();

在这里插入图片描述
你会发现,控制台报错了。这是因为上面代码中的 i 变量只存在于 for 循环这个块中,当循环结束,i 变量就被销毁了,所以在 for 循环外访问不到。(对比看 🎯var 的3️⃣的补充)


🎯const

1️⃣ const 也是 ES6 中新增的一种变量声明方式,它用于声明常量。使用 const 声明的变量必须进行初始化操作,不能在声明后再次赋值。这意味着,const 声明的变量值是不可变的,不能被重新赋值。(除了不能被重新赋值之外,const 声明的变量与 let 声明的变量类似,也具备块级作用域。)

📝例如:

❗❗❗const 声明的变量值是不可变的,不能被重新赋值。否则会报如下错误。

const MaxAge = 100;
MaxAge = 10;
console.log(MaxAge);

在这里插入图片描述

❗❗❗声明的变量必须进行初始化操作,不能在声明后再次赋值。否则会报如下错误。

const Num;
console.log(Num);

在这里插入图片描述

2️⃣ const 声明的变量不是真正的常量,而是指向内存地址的指针。因此,如果 const 声明的变量是对象或数组,虽然无法重新赋值,但是可以更改其属性或元素值。

📝值类型是指变量直接存储的数据,例如:

const num = 23;

这里 num 变量就是值类型,我们使用的是 const 关键字来定义 num,故赋予变量 num 的值 20 是不可改变的。

引用类型是指变量存储数据的引用,而数据是放在数据堆中,比如,用 const 声明一个数组。

const arr = ["一", "二", "三"];

如果你尝试去修改数组,同样会❗报错。

const arr = ["一", "二", "三"];
arr = ["五", "六", "七"];

在这里插入图片描述

但是,使用 const 关键字定义的引用类型还是可以通过数组下标去修改值 。例如:

const arr = ["一", "二", "三"];
arr[0] = "四";
arr[1] = "五";
arr[2] = "六";

console.log(arr);

在这里插入图片描述

因为变量 arr 保存的是数组的引用,并不是数组中的值,只要引用的地址不发生改变就不会保错。这就相当于一个房子,它拥有固定的位置,但住在房子里的人不一定固定。
在这里插入图片描述


🎯相关面试题

  • 请分别描述 var、let 和 const 的特点和使用场景?
  • 请解释 JavaScript 中的变量提升?var、let 和 const 是否存在变量提升?
  • 在函数内部,使用 var 和 let 声明的变量有什么区别?
  • const 声明一个对象时,可以修改对象的某些属性值,那么请问这是不符合 const 的定义吗?
  • 在循环语句中,使用 let 声明的变量与使用 var 声明的变量有什么区别?
  • 请列举出在 JavaScript 中 var 和 let 的最大区别?
  • 请列举出在 JavaScript 中使用 const 的原因?
  • 请写一个函数,该函数接受两个形参并返回它们的和,使用 const 关键字来声明变量。
  • 请解释 const 声明的数组中 push 操作的效果?并使用代码进行演示。
  • 请列举出只能使用 let 或 const 声明而不能使用 var 声明的情况?

📝总结

varletconst 是 JavaScript 中的三种变量声明方式,主要区别如下:

  • 变量作用范围不同var 声明的变量作用域为函数作用域(全局作用域),letconst 声明的变量作用域为块级作用域(在花括号 {} 内)。

  • 变量是否可以重复声明var 可以被重复声明,后面的声明会覆盖前面的声明;而 letconst 同一作用域内不允许重复声明相同名称的变量。

  • 变量初始化和赋值方式不同var 不需要进行初始化,定义时如果没有赋值会自动赋值为 undefined;letconst 声明时必须赋初值或者等待第一次被赋值。同时,const 声明的变量是一个常量,不允许改变其值。而 varlet 声明的变量可以被重新赋值。

  • 变量提升方式不同var 变量会存在变量提升,即在变量声明前使用该变量会得到 undefined,因为该变量已经被声明了;而 letconst 声明的变量不存在变量提升,必须在声明后才能使用。

使用场景:在实际开发中,可以根据具体需求来选择使用 varletconst,一般建议优先使用 const 声明常量,let 声明变量的情况下可以在需要修改变量值时使用,而 var 声明变量则可以在需要全局共享变量时使用。
在这里插入图片描述

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

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

相关文章

阿里云ECS大测评

本篇博客是阿里云 ECS实例测评&#xff0c;这里采用阿里的C5.large计算型实例 本次对云服务器ECS产品能力的体验和建议&#xff0c;可帮助其他用户选用云服务,使用云服务器ECS创建应用场景测评 首先对实例的硬件(CPU&#xff0c;内存&#xff0c;磁盘)进行测试&#xff0c;采…

数智未来·持续创新 | 易趋受邀出席DSMC 2023中国制造业数智峰会

3月17日-18日&#xff0c;以“数智未来持续创新”为主题的DSMC 2023中国制造业数智峰会在长沙成功召开。由中国通信工业协会指导&#xff0c;信息侠主办&#xff0c;湖南省数字经济促进会、浙江省数字经济联合会、安徽省首席信息官协会联合支持。鉴于易趋项目管理软件在制造行业…

数据出境是什么意思?我国数据出境合规要求是什么?

随着经济全球化深入以及云计算等技术的发展&#xff0c;数据在全球范围跨境流动。数据跨境在促进经济增长、加速创新的同时&#xff0c;对数据主权、数据权属、个人信息保护等一系列问题逐渐浮出水面。今天我们就先来了解一下数据出境是什么意思&#xff1f;我国数据出境合规要…

校招失败后,在外包公司熬了 2 年终于进了字节跳动,竭尽全力....

其实两年前校招的时候就往字节投了一次简历&#xff0c;结果很明显凉了&#xff0c;随后这个理想就被暂时放下了&#xff0c;但是这个种子一直埋在心里这两年除了工作以外&#xff0c;也会坚持写博客&#xff0c;也因此结识了很多优秀的小伙伴&#xff0c;从他们身上学到了特别…

我们现在怎样做父亲

离开了中学的课本后再没读过鲁迅的文章&#xff0c;今年想再读鲁迅。《我们现在怎样做父亲》这个题目本是鲁迅《坟》杂文集中的一篇&#xff0c;怎样做父亲是个人生大命题&#xff0c;毕竟一生中在这件事上不太能靠积累经验来熟练。所以&#xff0c;在做父亲这件事上不是一个技…

【BIM+GIS】BIM+GIS融合的意义与应用价值

文章目录 一、BIM、GIS解析二、BIM+GIS应用价值三、BIM+GIS应用四、BIM和GIS融合面临什么问题?一、BIM、GIS解析 BIM(建筑信息模型)是一种应用于工程设计、建造、管理的数据化工具,主要针对于微观单体建筑的应用,能够将建筑工程项目的各项相关信息数据集成在一个模型中,…

基于springboot实现生鲜超市管理的设计与实现演示【附项目源码】分享

基于springboot实现生鲜超市管理的设计与实现演示B/S的系统是通过能上网的电脑就可以使用&#xff0c;它最大的优点是不需要安装专门的软件&#xff0c;首先浏览器向服务器发出请求&#xff0c;然后服务器处理请求把信息再返回给浏览器。不需要再次对数据进行存取与计算数据&am…

行业分析| anyRTC智慧视频监控的应用

智慧视频监控是安全防范系统的重要组成部分&#xff0c;不仅可以达到一般视频监控系统的远程控制监控、视频回看&#xff0c;满足治安管理、城市管理、交通管理、应急指挥等需求&#xff0c;还具备防盗报警系统的预警信息作用&#xff0c;在预防、发现、控制、打击违法犯罪&…

零入门kubernetes网络实战-25->基于tap虚拟网络设备的测试用例以及协议栈封装解析介绍(helloworld级别)

《零入门kubernetes网络实战》视频专栏地址 https://www.ixigua.com/7193641905282875942 本篇文章视频地址(稍后上传) 本篇文章主要是分享一下tap虚拟网络设备。 创建tap网络设备的方式跟tun完全一样&#xff0c;只需要将类型改为tap即可。 这里不再占用篇幅介绍了。 1、本…

Matlab与ROS(1/2)---Message(三)

0. 简介 消息是ROS中交换数据的主要容器。主题和服务使用消息在节点之间传输数据。为了标识其数据结构&#xff0c;每条消息都有一个消息类型。例如&#xff0c;来自激光扫描仪的传感器数据通常以sensor_msgs/LaserScan类型的消息发送。每种消息类型标识消息中包含的数据元素。…

【Java Web】002 -- JS Vue快速入门

目录 一、JS快速入门 1、什么是JavaScript? 2、JS引入方式 ①、示例代码 3、JS基础语法 ①、书写语法 ②、变量 ③、数据类型 ④、运算符 ⑤、流程控制语句 4、JS函数 ①、第一种函数定义方式 function funcName(参数1&#xff0c;……) ②、第二种函数定义方式 var funcName …

Chatgpt4来了,测试小姐姐实测,在失业的边缘疯狂试探~

GPT-4是OpenAI于2023年3月发布的最新人工智能模型&#xff0c;它是继GPT-3.5之后的又一次重大突破。它的核心技术是基于Transformer的自回归语言模型&#xff0c;它使用了大量的无标注数据进行预训练&#xff0c;学习了自然语言和其他模态之间的通用表示和关系。我们今天来看看…

★Flash

1.NOR Flash和NAND Flash的区别 读速&#xff1a;Nor很快&#xff0c;NAND快 擦除/写入&#xff1a;Nor低&#xff0c;NAND高 访问方式&#xff1a;Nor一次写一个字节&#xff0c;按总线时序读写&#xff1b;NAND一次写多个&#xff08;512字节的块&#xff09;&#xff0c;…

【2023中高级向】53道vue面试题附答案

1. 谈一谈对 MVVM 的理解&#xff1f; 参考答案&#xff1a; MVVM 是 Model-View-ViewModel 的缩写。MVVM 是一种设计思想。Model 层代表数据模型&#xff0c;也可以在 Model 中定义数据修改和操作的业务逻辑;View 代表 UI 组件&#xff0c;它负责将数据模型转化成 UI 展现出来…

Spring MVC 图片的上传和下载

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

Graph Neural Networks: Graph Structure Learning

最近研究GNN的应用方面&#xff0c;遇到了很大的瓶颈&#xff0c;所以回归理论&#xff0c;潜心阅读图结构学习的理论知识&#xff0c;也希望给大家在学习时带来帮助&#xff0c;如有错误请私信指正&#xff01; Graph Neural Networks: Graph Structure Learning 摘要&#…

Day912.多环境配置隔离 -SpringBoot与K8s云原生微服务实践

多环境配置隔离 Hi&#xff0c;我是阿昌&#xff0c;今天学习记录的是关于多环境配置隔离的内容。 多环境支持&#xff0c;是现在互联网开发研发和交付的主流基本需求。通过规范多环境配置可以规范开发流程&#xff0c;并同时提示项目的开发质量和效率等。 一个公司应该规范…

计算机组成原理实验1---运算器 预习报告

本实验为哈尔滨工业大学计算机组成原理实验&#xff0c;实验内容均为个人完成&#xff0c;目的是分享交流&#xff0c;如有抄袭将追究责任&#xff0c;笔者能力有限&#xff0c;若因此影响读者的分数&#xff0c;本人深表抱歉。 一、 实验目的 了解运算器的组成结构基于数据通…

mybatis resource配置mapper

<mapper resource"com/hm/mapper/UserMapper.xml"/> 这种配置mapper和package配置资源的区别&#xff1f; 1.package解析mapper过程&#xff0c; 获取name对应的路径&#xff0c;获取class下的mapper,根据mapper里的路径拼接.xml解析文件&#xff0c;此时命名…

亚马逊、eBay、速卖通等跨境电商自养号测评,你知道多少?

自养号测评对跨境电商来说已经司空见惯&#xff0c;现在绝大部分卖家都有对店铺产品进行测评&#xff0c;虽然平台和消费者对测评补单很反感&#xff0c;但是在人人都测评的大环境的影响下不测评就意味着要被淘汰。 之前在一些论坛看到有博主分享自己对于广告和数据化的理解&a…
最新文章