js基础---var与let的区别以及const的使用
js基础—var与let的区别以及const的使用
var与let的区别
在较旧的JavaScript,使用关键字var来声明变量,而不是let。var现在开发中一般不再使用它,只是我们可能再老版程序中看到它。let的出现为了解决var的一些问题。
var 声明存在以下三种问题:
- 可以先使用在声明 (不合理)
- var声明过的变量可以重复声明(不合理)
- 比如变量提升、全局变量、没有块级作用域等等
举例说明
变量提升
var
的情况:
解释:console.log(a); // 输出undefined var a = 10;
var
声明的变量会被提升到函数或全局作用域的顶部,但此时变量的值还未被初始化,所以输出undefined
。let
的情况:
解释:console.log(b); // 报错,ReferenceError: b is not defined let b = 20;
let
声明的变量也会被提升,但不会被初始化,处于暂时性死区,所以访问它会报错。
重复声明
var
的情况:
解释:var c = 30; var c = 40; console.log(c); // 输出40
var
声明的变量可以重复声明,后面的声明会覆盖前面的声明。let
的情况:
解释:let d = 50; let d = 60; // 报错,SyntaxError: Identifier 'd' has already been declared
let
声明的变量不能重复声明,否则会报错。
作用域
var
的情况:
解释:if (true) {var e = 70; } console.log(e); // 输出70
var
声明的变量具有函数作用域或全局作用域,没有块级作用域,所以在if
块外部也可以访问到e
。let
的情况:
解释:if (true) {let f = 80; } console.log(f); // 报错,ReferenceError: f is not defined
let
声明的变量具有块级作用域,在if
块外部无法访问到f
。
全局变量
var
的情况:function g() {var h = 90; } g(); console.log(h); // 报错,ReferenceError: h is not defined
解释:在函数内部使用var i = 100; console.log(window.i); // 输出100
var
声明的变量不会成为全局变量。在全局作用域中使用var
声明的变量会成为全局对象(如浏览器中的window
)的属性。let
的情况:function j() {let k = 110; } j(); console.log(k); // 报错,ReferenceError: k is not defined
解释:let l = 120; console.log(window.l); // 输出undefined
let
声明的变量不会成为全局对象的属性,无论是函数内部还是全局作用域。
var
确实存在一些问题,如变量提升可能导致的逻辑错误、重复声明带来的混淆以及缺乏块级作用域等。在现代JavaScript开发中,推荐使用let
来声明变量,以避免这些问题,提高代码的可读性和可维护性。
常量const
概念
使用const
声明的变量称为“常量”。常量与变量的主要区别在于,常量一旦被赋值后,其值就不能再被改变。这使得常量在程序中具有稳定性和可预测性,有助于减少因意外修改而导致的错误。
使用场景
当某个变量的值在程序的整个生命周期中都不会改变时,就可以使用const
来声明。例如,一些数学常数、配置参数、枚举值等都可以使用const
声明。使用const
声明常量可以明确地表达出该值不应当被修改的意图,同时也能够让阅读代码的人更容易理解代码的意图。
命名规范
常量的命名规范与变量基本一致,但有一些细微的差别。通常情况下,常量的名称使用大写字母,单词之间用下划线连接,以突出其常量的特性。例如:
const MAX_VALUE = 100;
const PI = 3.14159;
这种命名方式可以让开发者在阅读代码时,能够快速识别出这是一个常量,而不是一个普通变量。
常量使用示例
// 声明一个常量
const G = 9.8;
// 输出这个常量
console.log(G);
注意事项
-
不允许重新赋值:常量一旦被赋值后,就不能再被重新赋值。如果尝试对常量重新赋值,将会导致语法错误。例如:
const G = 9.8; G = 9.9; // TypeError: Assignment to constant variable.
这一特性确保了常量的值在程序运行过程中始终保持不变。
-
声明时必须赋值(初始化):使用
const
声明常量时,必须在声明的同时进行初始化赋值。不能先声明常量,然后再赋值。例如:const G; // SyntaxError: Missing initializer in const declaration G = 9.8;
这是因为
const
声明的常量必须有一个明确的初始值,以保证其在整个作用域内的值都是确定的。
小技巧
对于不需要重新赋值的数据,使用const
是一个很好的选择。这不仅可以避免意外修改数据,还可以提高代码的可读性和可维护性。在实际开发中,养成使用const
的习惯,可以让你的代码更加健壮和清晰。
常量与对象属性
需要注意的是,虽然使用const
声明的对象本身不能被重新赋值,但对象的属性是可以被修改的。例如:
const obj = { name: 'Kimi', age: 20 };
obj.name = 'Moonshot'; // 合法操作,修改对象属性
console.log(obj); // 输出 { name: 'Moonshot', age: 20 }
这是因为const
只是保证了变量指向的对象引用不能改变,而不是对象内部的属性不能改变。如果需要保证对象的属性也不被修改,可以使用Object.freeze()
方法来冻结对象,使其成为不可变对象。例如:
const obj = { name: 'Kimi', age: 20 };
Object.freeze(obj);
obj.name = 'Moonshot'; // 不会改变对象属性,因为对象被冻结了
console.log(obj); // 输出 { name: 'Kimi', age: 20 }
通过这种方式,可以确保对象及其属性在整个程序中都不会被修改,从而实现更严格的数据保护。
总之,合理使用const
声明常量,可以在很大程度上提高代码的质量和稳定性。在编写JavaScript代码时,建议尽可能多地使用const
来声明那些不需要改变的值。
相关文章:
js基础---var与let的区别以及const的使用
js基础—var与let的区别以及const的使用 var与let的区别 在较旧的JavaScript,使用关键字var来声明变量,而不是let。var现在开发中一般不再使用它,只是我们可能再老版程序中看到它。let的出现为了解决var的一些问题。 var 声明存在以下三种问…...

用css和html制作太极图
目录 css相关参数介绍 边距 边框 伪元素选择器 太极图案例实现、 代码 效果 css相关参数介绍 边距 <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title><style>*{margin: 0;padding: 0;}div{width: …...

OJ12:160. 相交链表
目录 题目思路分析代码展示 题目 给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。 示例 1: 输入:intersectVal 8, listA [4,1,8,4,5], listB [5,…...
软件工程和项目管理领域 - CMMI 极简理解
CMMI 概述 CMMI 全称为 Capability Maturity Model Integration,即能力成熟度模型集成 CMMI 是由美国卡内基梅隆大学软件工程研究所(SEI)开发的一套综合性管理模型 CMMI 是一种用于评估和改进组织在软件开发和维护方面过程能力的国际标准 …...

C# 线程基础之 线程同步
线程同步的手段很多 lock 是通过内存索引块 0 1 切换 进行互斥的实现 互斥量 信号量 事件消息 其实意思就是 一个 标记量 通过这个标记 来进行类似的互斥手段 具体方式的分析 代码在后 1.互斥量 Mutex 作用 非常类似lock 一个Mutex 名称来代替 lock的引用对象 2.信号量 Semaph…...

[c语言日寄]c语言也有“回”字的多种写法——整数交换的三种方式
大家好啊,在今天的快乐刷题中,我们遇到了这样一道题目: 题目 写出 三种不同方式的 交换两个整数变量的 函数 交换变量的三种解法 常规方式 想要交换两个变量很简单,第一种方式就是新建一个临时变量,具体流程如下&…...

RocketMQ 知识速览
文章目录 一、消息队列对比二、RocketMQ 基础1. 消息模型2. 技术架构3. 消息类型4. 消费者类型5. 消费者分组和生产者分组 三、RocketMQ 高级1. 如何解决顺序消费和重复消费2. 如何实现分布式事务3. 如何解决消息堆积问题4. 如何保证高性能读写5. 刷盘机制 (topic 模…...
优化 Azure Synapse Dedicated SQL Pool中的 SQL 执行性能的经验方法
在 Azure Synapse Dedicated SQL Pool中优化 SQL 执行涉及了解底层体系结构(例如分布和分区)、查询优化(例如避免不必要的子查询和联接),以及利用具体化视图和 PolyBase 等工具进行高效数据加载。 1.有效使用分布和分…...
详解英语单词“pro bono”:公益服务的表达(中英双语)
中文版 详解英语单词“pro bono”:公益服务的表达 一、词义解释 “Pro bono” 是一个源自拉丁语的短语,完整表达为 “pro bono publico”,意思是“为了公众利益”(for the public good)。在现代英语中,它…...
16. C语言 字符串详解
本章目录: 前言C 字符串的基础概念字符串的定义字符串的内存表示 常见的字符串操作函数示例代码 深入探讨字符串长度计算strlen 与 sizeof 的区别 字符串操作的注意事项**1. 字符数组的大小**2. 字符数组和字符指针的区别3. 使用安全函数 字符串的遍历与格式化输出**遍历字符串…...

使用Buildroot开始嵌入式Linux系统之旅-3
文章目录 at91bootstrap操作教程修改at91bootstrap具体配置重新编译at91bootstrap U-Boot操作教程修改U-Boot具体配置重新编译U-Boot Linux Kernel操作教程修改Linux Kernel具体配置重新编译Linux Kernel buildroot操作进阶生成图形化软件模块依赖关系查看具体软件模块依赖关系…...

[免费]SpringBoot+Vue新能源汽车充电桩管理系统【论文+源码+SQL脚本】
大家好,我是java1234_小锋老师,看到一个不错的SpringBootVue新能源汽车充电桩管理系统,分享下哈。 项目视频演示 【免费】SpringBootVue新能源汽车充电桩管理系统 Java毕业设计_哔哩哔哩_bilibili 项目介绍 随着信息化时代的到来࿰…...

【已解决】【记录】2AI大模型web UI使用tips 本地
docker desktop使用 互动 如果需要发送网页链接,就在链接上加上【#】号 如果要上传文件就点击这个➕号 中文回复 命令它只用中文回复,在右上角打开【对话高级设置】 输入提示词(提示词使用英文会更好) Must reply to the us…...
44.ComboBox的数据绑定 C#例子 WPF例子
固定最简步骤,包括 XAML: 题头里引入命名空间 标题下面引入类 combobox绑定资源属性和选择属性,block则绑定和combobox一样的选择属性 C#: 通知的类,及对应固定的任务 引入字段 引入属性 其中资源是只读的 选…...
物联网之传感器技术
引言 在数字化浪潮席卷全球的今天,物联网(IoT)已成为推动各行各业变革的重要力量。而物联网传感器,作为物联网感知层的核心技术,更是扮演着不可或缺的角色。它们如同人类的五官,能够感知物理世界中的各种信…...

QTreeWidget QTreeWidgetItem
QTreeWidgetItem 是 Qt 框架中用于在 QTreeWidget 中表示树形结构中每个节点的类。它是 QTreeWidget 的一部分,允许您创建和管理层次结构的数据展示。 QTreeWidgetItem 用于表示树形结构中的单个节点。 添加子节点: 可以通过 addChild() 方法向节点添加…...
torch.einsum计算张量的外积
torch.einsum 是一种强大的张量操作工具,可以通过爱因斯坦求和约定(Einstein summation convention)来简洁地表示复杂的张量运算。通过它,我们可以高效地计算矩阵乘法、转置、点积、外积等操作。 以下是关于如何使用 torch.einsum 计算两个四维张量在第三维度上的外积的解…...
PostgreSQL 超级管理员详解
1. 什么是 PostgreSQL 超级管理员 PostgreSQL 超级管理员(superuser)是拥有数据库系统最高权限的用户。他们可以执行任何数据库操作,包括但不限于创建和删除数据库、用户、表空间、模式等。超级管理员权限是 PostgreSQL 中权限的最高级别。 …...

RabbitMQ 工作模式使用案例之(发布订阅模式、路由模式、通配符模式)
Hi~!这里是奋斗的明志,很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~~ 🌱🌱个人主页:奋斗的明志 🌱🌱所属专栏:RabbitMQ 📚本系列文章为个人学…...

【2024年华为OD机试】(C卷,100分)- 机场航班调度程序 (Java JS PythonC/C++)
一、问题描述 题目描述 XX市机场停放了多架飞机,每架飞机都有自己的航班号,如CA3385,CZ6678,SC6508等,航班号的前2个大写字母(或数字)代表航空公司的缩写,后面4个数字代表航班信息…...

利用最小二乘法找圆心和半径
#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...

树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法
树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作,无需更改相机配置。但是,一…...

(二)TensorRT-LLM | 模型导出(v0.20.0rc3)
0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述,后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作,其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...

为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?
在建筑行业,项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升,传统的管理模式已经难以满足现代工程的需求。过去,许多企业依赖手工记录、口头沟通和分散的信息管理,导致效率低下、成本失控、风险频发。例如&#…...
【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表
1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...
汇编常见指令
汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX(不访问内存)XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...

【网络安全】开源系统getshell漏洞挖掘
审计过程: 在入口文件admin/index.php中: 用户可以通过m,c,a等参数控制加载的文件和方法,在app/system/entrance.php中存在重点代码: 当M_TYPE system并且M_MODULE include时,会设置常量PATH_OWN_FILE为PATH_APP.M_T…...
探索Selenium:自动化测试的神奇钥匙
目录 一、Selenium 是什么1.1 定义与概念1.2 发展历程1.3 功能概述 二、Selenium 工作原理剖析2.1 架构组成2.2 工作流程2.3 通信机制 三、Selenium 的优势3.1 跨浏览器与平台支持3.2 丰富的语言支持3.3 强大的社区支持 四、Selenium 的应用场景4.1 Web 应用自动化测试4.2 数据…...

数据结构:递归的种类(Types of Recursion)
目录 尾递归(Tail Recursion) 什么是 Loop(循环)? 复杂度分析 头递归(Head Recursion) 树形递归(Tree Recursion) 线性递归(Linear Recursion)…...

高考志愿填报管理系统---开发介绍
高考志愿填报管理系统是一款专为教育机构、学校和教师设计的学生信息管理和志愿填报辅助平台。系统基于Django框架开发,采用现代化的Web技术,为教育工作者提供高效、安全、便捷的学生管理解决方案。 ## 📋 系统概述 ### 🎯 系统定…...