【JavaScript】深入理解 `let`、`var` 和 `const`
文章目录
- 一、`var` 的声明与特点
- 二、`let` 的声明与特点
- 三、`const` 的声明与特点
- 四、`let`、`var` 和 `const` 的对比
- 五、实战示例
- 六、最佳实践
在 JavaScript 中,变量声明是编程的基础,而
let、var和const是三种常用的变量声明方式。本文将详细介绍这三种变量声明方式的特点、用法、差异及最佳实践,帮助您全面掌握它们的使用方法和适用场景。
一、var 的声明与特点
var 是 variable 的缩写,表示“变量”的意思。是 ES5 及之前版本中唯一的变量声明方式。它具有一些独特的特性,但这些特性有时会导致意外的行为。
var 的声明
使用 var 声明的变量可以在函数作用域或全局作用域中访问。
var x = 10;
console.log(x); // 输出: 10
函数作用域
var 的作用域是函数级别的,而不是块级别的。这意味着 var 声明的变量在函数内的任何地方都可以访问。
function example() {if (true) {var x = 10;}console.log(x); // 输出: 10
}
example();
变量提升(Hoisting)
var 声明的变量会被提升到其作用域的顶部。这意味着变量可以在声明之前使用,但值为 undefined。
console.log(x); // 输出: undefined
var x = 10;
二、let 的声明与特点
let 是 ES6 引入的变量声明方式,旨在解决 var 的一些问题。let 具有块级作用域,并且不会提升。
let 的声明
使用 let 声明的变量具有块级作用域,并且只能在声明后使用。
let y = 20;
console.log(y); // 输出: 20
块级作用域
let 的作用域是块级别的,这意味着变量只能在块内访问。
if (true) {let y = 20;console.log(y); // 输出: 20
}
console.log(y); // 抛出 ReferenceError: y is not defined
不存在变量提升
使用 let 声明的变量不会提升,因此在声明之前使用会导致错误。
console.log(y); // 抛出 ReferenceError: y is not defined
let y = 20;
三、const 的声明与特点
const 是 constant 的缩写,表示“常量”的意思。也是 ES6 引入的,用于声明常量。const 变量声明后不能重新赋值。
const 的声明
使用 const 声明的变量必须在声明时初始化,并且不能重新赋值。
const z = 30;
console.log(z); // 输出: 30
块级作用域
const 的作用域是块级别的,与 let 类似。
if (true) {const z = 30;console.log(z); // 输出: 30
}
console.log(z); // 抛出 ReferenceError: z is not defined
常量的不可变性
使用 const 声明的变量不能重新赋值,但对于对象和数组,const 只保证引用地址不变,内部数据仍可修改。
const person = { name: 'John', age: 25 };
person.age = 26;
console.log(person); // 输出: { name: 'John', age: 26 }
四、let、var 和 const 的对比
作用域对比
var:函数作用域let和const:块级作用域
变量提升对比
var:变量提升let和const:不提升
重新赋值
var和let:可以重新赋值const:不能重新赋值
使用建议
在现代 JavaScript 开发中,推荐优先使用 let 和 const。使用 const 声明常量,只有在需要重新赋值时才使用 let,尽量避免使用 var。
五、实战示例
示例 1:let 和 const 在循环中的使用
for (let i = 0; i < 3; i++) {console.log(i); // 输出: 0, 1, 2
}
console.log(i); // 抛出 ReferenceError: i is not definedconst arr = [1, 2, 3];
for (const num of arr) {console.log(num); // 输出: 1, 2, 3
}
示例 2:使用 const 声明对象和数组
const person = {name: 'Alice',age: 28
};
person.age = 29;
console.log(person); // 输出: { name: 'Alice', age: 29 }const numbers = [1, 2, 3];
numbers.push(4);
console.log(numbers); // 输出: [1, 2, 3, 4]
示例 3:避免 var 的变量提升问题
function example() {console.log(a); // 输出: undefinedvar a = 10;console.log(a); // 输出: 10
}function betterExample() {let b;console.log(b); // 输出: undefinedb = 10;console.log(b); // 输出: 10
}example();
betterExample();
六、最佳实践
优先使用 const
尽量使用 const 声明变量,确保变量不会被重新赋值,增加代码的可读性和可维护性。
仅在必要时使用 let
只有在需要重新赋值时才使用 let,如在循环或条件语句中。
避免使用 var
尽量避免使用 var,以减少潜在的变量提升和作用域混淆问题。

相关文章:
【JavaScript】深入理解 `let`、`var` 和 `const`
文章目录 一、var 的声明与特点二、let 的声明与特点三、const 的声明与特点四、let、var 和 const 的对比五、实战示例六、最佳实践 在 JavaScript 中,变量声明是编程的基础,而 let、var 和 const 是三种常用的变量声明方式。本文将详细介绍这三种变量声…...
云监控(华为) | 实训学习day7(10)
水一篇。。。。。。。。。。。。。 强迫症打卡必须要满 企拓 今天没有将东西 2024/7/22 规划学习路线对于进入AI行业至关重要。以下是一个详细的学习路线规划,旨在帮助你从零基础到成为一名合格的AI或大数据分析师: 第一阶段:基础知识建设…...
JS_plus.key.addEventListener监听键盘按键
官方文档:https://www.html5plus.org/doc/zh_cn/key.html 监听事件 plus.key.addEventListener(keydown, e > {console.log("keydown: "e.keyCode) }) plus.key.addEventListener(keyup, e > {console.log("keyup: "e.keyCode) })移除事…...
对话系统(Chat)与自主代理(Agent)对撞
随着生成式AI技术的不断进步,关于其未来发展方向的讨论也愈发激烈。究竟生成式AI的未来是在对话系统(Chat)中展现智慧,还是在自主代理(Agent)中体现能力?这一问题引发了广泛的讨论和探索。 首先…...
sql server 连接报错error 40
做个简单的记录,造成40 的原因有很多,你的错误并不一定就是我遇到的这种情况. 错误描述: 首先我在使用ssms 工具连接的时候是可以正常连接的,也能对数据库进行操作. 在使用 ef core 连接 Sql Server 时报错: Microsoft.Data.SqlClient.SqlException (0x80131904): A network-r…...
邮件安全篇:如何防止邮件泄密?
本文主要讨论组织内部用户违反保密规定通过邮件泄密的场景。其他场景导致邮箱泄密的问题(如账号被盗、邮件系统存在安全漏洞等)不在本文的讨论范围。本文主要从邮件系架构设计、邮件数据防泄漏系统、建立健全规章制度、安全意识培训等方面分别探讨。 1. …...
MySQL查询优化:提升数据库性能的策略
在数据库管理和应用中,优化查询是提高MySQL数据库性能的关键环节。随着数据量的不断增长,如何高效地检索和处理数据成为了一个重要的挑战。本文将介绍一系列优化MySQL查询的策略,帮助开发者和管理员提升数据库的性能。 案例1: 使用索引优化查…...
vue-快速入门
Vue 前端体系、前后端分离 1、概述 1.1、简介 Vue (发音为 /vjuː/,类似 view) 是一款用于构建用户界面的 JavaScript 框架。它基于标准 HTML、CSS 和 JavaScript 构建,并提供了一套声明式的、组件化的编程模型,可以高效地开发用户界面。…...
【网络流】——初识(最大流)
网络流-最大流 基础信息引入一些概念基本性质 最大流定义 Ford–Fulkerson 增广Edmons−Karp算法Dinic 算法参考文献 基础信息 引入 假定现在有一个无限放水的自来水厂和一个无限收水的小区,他们之间有多条水管和一些节点构成。 每一条水管有三个属性:…...
【STM32嵌入式系统设计与开发---拓展】——1_10矩阵按键
这里写目录标题 1、矩阵按键2、代码片段分析 1、矩阵按键 通过将4x4矩阵按键的每一行依次设为低电平,同时保持其它行为高电平,然后读取所有列的电平状态,可以检测到哪个按键被按下。如果某列变为低电平,说明对应行和列的按键被按下…...
长期更新方法库推荐pmq-ui
# pmq-ui pmq-ui 好用方法库ui库, 欢迎您的使用 ## 安装 1. 克隆项目库到本地: 2. 进入项目目录:cd pmq-ui 3. 安装依赖:npm install pmq-ui ## 使用 <!-- 1. 启动应用: 2. 访问 [http://localhost:3000](http://localhost:300…...
<数据集>抽烟识别数据集<目标检测>
数据集格式:VOCYOLO格式 图片数量:4860张 标注数量(xml文件个数):4860 标注数量(txt文件个数):4860 标注类别数:1 标注类别名称:[smoking] 使用标注工具:labelImg 标注规则:对…...
SQL Server 端口设置教程
引言 你好,我是悦创。 在配置 SQL Server 的过程中,设置正确的端口非常关键,因为它影响到客户端如何连接到 SQL Server 实例。默认情况下,SQL Server 使用 TCP 端口 1433,但在多实例服务器上或出于安全考虑ÿ…...
【React1】React概述、基本使用、脚手架、JSX、组件
文章目录 1. React基础1.1 React 概述1.1.1 什么是React1.1.2 React 的特点声明式基于组件学习一次,随处使用1.2 React 的基本使用1.2.1 React的安装1.2.2 React的使用1.2.3 React常用方法说明React.createElement()ReactDOM.render()1.3 React 脚手架的使用1.3.1 React 脚手架…...
k8s部署kafka集群
k8s部署kafka集群 kafka(Kafka with KRaft) mkdir -p ~/kafka-ymlkubectl create ns kafkacat > ~/kafka-yml/kafka.yml << EOF apiVersion: v1 kind: Service metadata:name: kafka-headlessnamespace: kafkalabels:app: kafka spec:type: C…...
(C++回溯01) 组合
77、组合 回溯题目三步走 1. 确定参数 2. 确定终止条件 3. for 循环横向遍历,递归纵向遍历 class Solution { public:vector<vector<int>> result;vector<int> path;void backtracking(int n, int k, int startIndex) {if(path.size() k) {…...
k8s学习笔记——安装istio的仪表盘之prometheus安装
接上一篇,继续安装istio的dashboard。 先到istio-1.22.0/samples/addons目录下,把yaml文件中的镜像仓库地址修改了,修改地址参考我之前写的CSDN里的镜像对照表。不然直接执行kubectl apply -f samples/addons这个命令后,依据会出…...
四、GD32 MCU 常见外设介绍 (7) 7.I2C 模块介绍
7.1.I2C 基础知识 I2C(Inter-Integrated Circuit)总线是一种由Philips公司开发的两线式串行总线,用于内部IC控制的具有多端控制能力的双线双向串行数据总线系统,能够用于替代标准的并行总线,连接各种集成 电路和功能模块。I2C器件能够减少电…...
Apollo 配置中心的部署与使用经验
前言 Apollo(阿波罗)是携程开源的分布式配置管理中心。 本文主要介绍其基于 Docker-Compose 的部署安装和一些使用的经验 特点 成熟,稳定支持管理多环境/多集群/多命名空间的配置配置修改发布实时(1s)通知到应用程序支…...
Perl中的设计模式革新:命令模式的实现与应用
Perl中的设计模式革新:命令模式的实现与应用 在面向对象编程中,设计模式是解决特定问题的成熟模板。命令模式作为行为设计模式之一,它将请求封装为对象,从而允许用户根据不同的请求对客户进行参数化。本文将深入探讨如何在Perl中…...
Qwen3-ForcedAligner-0.6B生产环境:支持日均1000+分钟音频批处理任务
Qwen3-ForcedAligner-0.6B生产环境:支持日均1000分钟音频批处理任务 1. 项目概述 Qwen3-ForcedAligner-0.6B是一款基于阿里巴巴先进语音识别技术开发的本地化智能语音转录工具。该工具采用双模型架构设计,集成了Qwen3-ASR-1.7B语音识别模型和ForcedAli…...
嵌入式C语言变量初始化技术详解
## 1. 嵌入式C语言变量初始化技术详解### 1.1 初始化的重要性与基本原则在嵌入式系统开发中,变量初始化是防止未定义行为的关键步骤。由于嵌入式编译器特性的差异,未初始化的变量可能包含随机值,导致系统出现不可预测的行为。根据变量类型的不…...
Claude Code智能测试生成:5步构建企业级自动化测试体系
Claude Code智能测试生成:5步构建企业级自动化测试体系 【免费下载链接】claude-code Claude Code is an agentic coding tool that lives in your terminal, understands your codebase, and helps you code faster by executing routine tasks, explaining comple…...
OpenClaw会议纪要大师:Qwen3-32B实时转录飞书语音会议
OpenClaw会议纪要大师:Qwen3-32B实时转录飞书语音会议 1. 为什么需要自动化会议纪要 每次开完会最头疼的就是整理会议纪要。作为团队的技术负责人,我每周要参加至少8场跨部门会议,传统的手动记录方式让我苦不堪言——要么记录不全重点&…...
SEO_2024年最新SEO趋势分析与实战策略解读
<h1 id"2024seo">2024年最新SEO趋势分析与实战策略解读</h1> <p>在数字营销的快速发展中,搜索引擎优化(SEO)作为提升网站流量的重要手段,一直备受关注。2024年,SEO领域再度发生了一些重要…...
从反射率到耐候性:5个关键参数教你像专业人士一样测试LED封装胶水
从反射率到耐候性:5个关键参数教你像专业人士一样测试LED封装胶水 在LED制造领域,封装胶水就像光学系统的"隐形工程师",它不仅要牢固固定芯片和荧光粉,更承担着光线管理的关键任务。一款优质的高反射率封装胶水…...
[特殊字符] Meixiong Niannian画图引擎应用场景:独立音乐人专辑封面AI生成流程
Meixiong Niannian画图引擎应用场景:独立音乐人专辑封面AI生成流程 1. 项目简介 Meixiong Niannian画图引擎是一款专为个人GPU设计的轻量化文本生成图像系统,基于Z-Image-Turbo底座和meixiong Niannian Turbo LoRA技术构建。这个引擎针对通用画图场景进…...
Leptin30;YQQVLTSLPSQNVLQIANDLENLRDLLHLL (mouse)
一、基本信息名称: Leptin30(小鼠源瘦素功能片段肽)单字母序列: YQQVLTSLPSQNVLQIANDLENLRDLLHLL三字母序列: Tyr-Gln-Gln-Val-Leu-Thr-Ser-Leu-Pro-Ser-Gln-Asn-Val-Leu-Gln-Ile-Ala-Asn-Asp-Leu-Glu-Asn-Leu-Arg-Asp…...
数智驱动 人才筑基——拔尖创新人才与卓越工程师培养论坛举行
3月22日,第二届高等院校新工科人才培养暨产教融合发展大会在北京举行。大会以“科技创新 智造未来”为主题,来自全国各地的本科院校、职业院校、行业企业以及媒体等1000余位嘉宾参会。22日下午,数智驱动 人才筑基——拔尖创新人才与卓越工程师…...
OpenCore Legacy Patcher终极指南:让你的老Mac焕发新生,体验最新macOS
OpenCore Legacy Patcher终极指南:让你的老Mac焕发新生,体验最新macOS 【免费下载链接】OpenCore-Legacy-Patcher 体验与之前一样的macOS 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher 你是否还在为老旧的Mac无法升…...
