JavaScript - 变量声明(let、const 和其他)
目录
一、引言
1. let 的作用
2. const 的作用
3. let 与 const 的选择
4. let 和 const 的性能
5. var, let, const 的对比
6. 常见误区
二、其他变量定义
1. var 关键字
2. 全局对象属性
3. 使用 IIFE(立即调用函数表达式)
4. ES6 模块
总结
一、引言
- 简要介绍 JavaScript 的变量声明方式(
var
,let
,const
)。- 解释为什么
let
和const
被引入到 ES6 中,以及它们的目的。
1. let
的作用
-
块级作用域:
-
let
声明的变量具有块级作用域(var
是函数作用域)。 - 示例:
-
{let x = 10;
}
console.log(x); // ReferenceError: x is not defined
避免变量提升:
-
let
声明的变量不会提升到块的顶部。- 示例:
console.log(a); // undefined
var a = 5;console.log(b); // ReferenceError: Cannot access 'b' before initialization
let b = 10;
重复声明:
-
- 在同一作用域内,不能使用
let
重复声明同一变量。 - 示例:
- 在同一作用域内,不能使用
const pi = 3.14;
pi = 3.14159; // TypeError: Assignment to constant variable.
2. const
的作用
-
常量声明:
const
用于声明常量,表明该变量的绑定不可以被重新赋值。- 示例:
const pi = 3.14;
pi = 3.14159; // TypeError: Assignment to constant variable.
-
块级作用域:
const
也具有块级作用域,与let
类似。- 示例:
{const d = 20;
}
console.log(d); // ReferenceError: d is not defined
-
引用类型:
const
只保证变量引用的地址不变,对于对象和数组的内容是可以修改的。- 示例:
const obj = { key: "value" };
obj.key = "newValue"; // 合法,obj 仍然引用同一个对象
console.log(obj.key); // 输出: "newValue"obj = {}; // TypeError: Assignment to constant variable.
3. let
与 const
的选择
-
何时使用
let?
- 当需要在代码块中重新赋值的变量时,应该使用
let
。例如,在循环中或在需要改变值的场合。 - 示例:
- 当需要在代码块中重新赋值的变量时,应该使用
for (let i = 0; i < 5; i++) {console.log(i); // 输出 0, 1, 2, 3, 4
}
// console.log(i); // ReferenceError: i is not defined
-
何时使用
const?
- 当你希望声明一个不应该被重新赋值的变量时,使用
const
。这有助于提高代码的可读性和可维护性,特别是在使用常量(如配置、API URL 等)。 - 示例:
- 当你希望声明一个不应该被重新赋值的变量时,使用
const maxUsers = 100; // 常量
-
最佳实践:
- 推荐在可能的情况下总是使用
const
,只有在需要重新赋值时才使用let
。这样可以减少意外的重新赋值错误,增加代码的清晰度。
- 推荐在可能的情况下总是使用
4. let
和 const
的性能
性能影响:
- 在大多数情况下,
let
和const
的性能差异几乎可以忽略不计,主要应该关注可读性和可维护性。- 现代 JavaScript 引擎在性能方面进行了优化,因此通常不需要担心选择
let
或const
会导致显著的性能问题。
5. var
, let
, const
的对比
-
作用域:
var
:函数作用域。let
和const
:块级作用域。
-
提升:
var
:变量提升,初始化为undefined
。let
和const
:不会提升,使用前必须先声明。
-
重复声明:
var
:可以在同一作用域内重复声明。let
和const
:不能在同一作用域内重复声明。
-
可变性:
var
和let
:可以重新赋值。const
:不能重新赋值,但对于对象和数组内容是可变的。
6. 常见误区
-
const
不可变: 许多人误解const
是不可变的。这是错误的。const
只保证引用不变,而不是对象的内容。- 示例:
const arr = [1, 2, 3];
arr.push(4); // 合法
console.log(arr); // 输出: [1, 2, 3, 4]arr = [5, 6]; // TypeError: Assignment to constant variable.
-
在循环中使用
let
: 在循环中用let
声明变量,每次迭代都会创建一个新的作用域,适用于保持每次迭代的独立性。- 示例:
for (let j = 0; j < 3; j++) {setTimeout(() => {console.log(j); // 输出 0, 1, 2}, 100);
}
二、其他变量定义
当然,除了
let
和const
,JavaScript 中还有其他几种定义变量的方式。
1. var
关键字
-
定义和作用域:
var
是 JavaScript 中的传统变量声明方式,定义的变量具有函数作用域,或者在全局作用域中声明时是全局的。
-
变量提升:
- 使用
var
声明的变量在函数或全局作用域内会被提升到顶部,初始化为undefined
。
- 使用
-
示例:
console.log(x); // 输出: undefined var x = 5;function test() {var y = 10; } console.log(y); // ReferenceError: y is not defined
-
重复声明:
- 在同一作用域内,
var
允许重复声明变量。
- 在同一作用域内,
-
使用建议:
- 由于
var
的作用域和提升特性,通常建议使用let
和const
进行变量声明。
- 由于
2. 全局对象属性
-
定义全局变量:
- 在浏览器环境中,直接为一个未声明的变量赋值时,会将其添加为全局对象(
window
)的属性。
- 在浏览器环境中,直接为一个未声明的变量赋值时,会将其添加为全局对象(
-
示例:
myGlobalVar = "Hello, World!"; // 不使用 var/let/const console.log(window.myGlobalVar); // 输出: "Hello, World!"
-
使用建议:
- 尽量避免这样做,以防止命名冲突和不可预测的行为。
3. 使用 IIFE(立即调用函数表达式)
-
封装和作用域:
- 通过 IIFE 创建一个新的作用域,用于封装变量,防止变量污染全局命名空间。
-
示例:
(function() {var localVar = "I'm local";console.log(localVar); // 输出: "I'm local" })();console.log(localVar); // ReferenceError: localVar is not defined
4. ES6 模块
-
使用模块化:
- 在 ES6 中,可以使用模块(
import
和export
)定义变量,模块中的变量默认是私有的,不会污染全局命名空间。
- 在 ES6 中,可以使用模块(
-
示例:
// module.js export const moduleVar = "I'm a module variable";// main.js import { moduleVar } from './module.js'; console.log(moduleVar); // 输出: "I'm a module variable"
总结
- 现代 JavaScript 编程中,推荐使用
let
和const
,因为它们的作用域更加明确,有助于减少错误。 - 传统的
var
仍然存在,但应谨慎使用。 - 其他定义变量的方式(如全局对象属性、对象和数组属性、函数、本地作用域等)可以在特定情况中使用,但最好遵循模块化和封装的良好实践。
相关文章:
JavaScript - 变量声明(let、const 和其他)
目录 一、引言 1. let 的作用 2. const 的作用 3. let 与 const 的选择 4. let 和 const 的性能 5. var, let, const 的对比 6. 常见误区 二、其他变量定义 1. var 关键字 2. 全局对象属性 3. 使用 IIFE(立即调用函数表达式) 4. ES6 模块 总结 …...

AC800PEC PC D231 3BHE025541R0101控制模块面价
AC800PEC PC D231 3BHE025541R0101控制模块面价 AC800PEC PC D231 3BHE025541R0101控制模块面价 AC800PEC PC D231 3BHE025541R0101控制模块面价 AC800PEC PC D231 3BHE025541R0101控制模块引脚线 AC800PEC PC D231 3BHE025541R0101控制模块说明书 AC800PEC PC D231 3BHE0…...

2024年3款免费录屏软件,你的电脑桌面上缺哪一个?
现在,不管是上网课、在家工作,还是拍视频,录屏软件都变得越来越重要了。想做个教学视频、录个操作指南,或者录个游戏的高光时刻,好的录屏软件都能帮你轻松搞定。这篇文章就是要聊聊免费录屏软件一般都有啥功能…...

Python爬虫新手指南及简单实战
网络爬虫是自动化获取网络信息的高效工具,Python因其强大的库支持和简洁的语法成为编写网络爬虫的首选语言。本教程将通过一个具体的案例(基于Microsoft Edge浏览器的简单爬取),指导你使用Python实现一个完整的网络爬虫࿰…...

如何有效开展产业链招商?
产业链招商是一种以产业大数据为依托、以产业链图谱为基础、以产业链分析为核心、以完善产业链结构为目标的招商引资方式。相比于传统招商模式,产业链招商比拼的并不是土地、政策优惠,而是以产业链分析为核心,诊断区域产业链结构及长短板&…...

爬虫中使用多进程、多线程的混合方式遇到的数据丢失问题
项目场景: 网络爬虫项目,主要实现多进程、多线程方式快速缓存网页资源到MongoDB,并解析网页数据,将信息写入到csv文件中。 问题描述 在单独使用多线程的过程中,是没有问题的,比如这个爬虫示例是爬取豆瓣电…...

多云应用安全平台RegData利用MongoDB简化数据控制和合规流程
在高度规范化市场中,为了保障数据安全,企业可能需要部署一系列繁琐且成本高昂的IT基础设施系统。随着各项数据安全保护措施的出台,企业需要遵守的法规数量越多,尤其是跨越多个地域的企业,其IT基础设施就会越复杂。如今…...

VUE实现TAB切换不同页面
VUE实现TAB切换不同页面 实现效果 资源准备 ReceiveOrderList, TodoListMulti, SignList 这三个页面就是需要切换的页面 首页代码 <template><div><el-tabs v-model"activeTab" type"card" tab-click"handleTabClick"><…...

C++ 80行 极简扫雷
一共5346个字符,MinGW编译通过(强烈不建议写这种代码!!!) 压行规则:一行不超过80个字符 代码: #include<windows.h> #include<stdio.h> #include<time.h> #def…...

常见VPS服务器附加组件一览
网络主机行业竞争非常激烈,因此主机服务提供商竭尽全力为客户提供完整的解决方案,其中包含构建和管理在线项目所需的一切。但客户通常有特定需求,因此需要不同的附加组件。在管理自己的网络服务器时尤其如此。 今天,我们将介绍您…...

Electron 使用Electron-build 进行打包
看完下面两篇就可以完成! 基于vue3vite的web项目改为Electron桌面应用(一)_vue3转electron-CSDN博客 将web项目打包成electron桌面端教程(二)vue3vitets_vue3 打包桌面端-CSDN博客 打包报错 1. 首先确定依赖包 npm …...
Springboot+Websocket+Security+Vue 实现弹幕推送功能
后端部分 (Spring Boot) 1. 创建一个 Spring Boot 项目 创建一个新的 Spring Boot 项目并添加以下依赖: <dependencies><!-- Spring Boot Starter Web --><dependency><groupId>org.springframework.boot</groupId><artifactId…...

LangChain之网络爬虫
网络爬虫 概述 网络爬虫是LangChain中的一项关键功能,允许用户自动从互联网上收集信息。这项功能对于研究和数据收集尤其有价值,因为它可以大幅减少手动搜索和信息整理的工作量。 从网络收集内容有几个主要组件: Search搜索:使用…...

VueRouter 相关信息
VueRouter 是Vue.js官方路由插件,与Vue.js深度集成,用于构建单页面应用。构建的单页面是基于路由和组件,路由设定访问路径,将路径与组件进行映射。VueRouter有两中模式 :hash 和 history ,默认是hash模式。…...

[环境配置]Pycharm:Failed to start [PowerShell.exe]
解决方法,点Local旁边的 号,点击Command Prompt,即可在Pycharm中呼出控制台。 如果要修改Command Prompt的启动时访问的cmd.exe的路径,可以去Settings→Tools→Terminal中,修改Shell Path实现,改为cmd.exe…...

搜狗爬虫(www.sogou.com)IP及UA,真实采集数据
一、数据来源: 1、这批搜狗爬虫(www.sogou.com)IP来源于尚贤达猎头网站采集数据; 2、数据采集时间段:2023年10月-2024年7月; 3、判断标准:主要根据用户代理是否包含“www.sogou.com”和IP核实…...

北京青蓝智慧科技ITSS服务经理:长安链ChainBridge“链桥”问世 加速国家级区块链网络互联互通
8月5日,据国家区块链技术创新中心消息,我国首个完全自主控制的区块链软硬件技术系统——长安链,正式推出了全场景技术平台ChainBridge“链桥”。 此平台能够支持所有异构和同构的区块链进行协作,满足跨领域、跨地域、跨行业及跨层…...

音视频入门基础:WAV专题(5)——FFmpeg源码中解码WAV Header的实现
音视频入门基础:WAV专题系列文章: 音视频入门基础:WAV专题(1)——使用FFmpeg命令生成WAV音频文件 音视频入门基础:WAV专题(2)——WAV格式简介 音视频入门基础:WAV专题…...
爬虫:csv存储:写入和读取
目录 csv写入 csv读取 csv写入 import csv# data [ # (tf, 20, 180), # (dl, 20, 170), # (hc, 18, 190) # ] # header (姓名,年龄,身高) # # # csv写入数据会默认写一行隔一行 newline就是让它不要有空行 # with open(text.csv,w,encodingutf8,newline) as f:…...

Opencv-绘制几何图形
1. 绘制圆形 1.1 circle()函数原型 void cv::circle(InputOutputArray img, Point center, int radius, const Scalar & color, int thickness 1, int lineType LINE_8, int shift 0 ) img:需要绘制圆形的图像。 center:圆形的圆心位置坐标。 …...

【Axure高保真原型】引导弹窗
今天和大家中分享引导弹窗的原型模板,载入页面后,会显示引导弹窗,适用于引导用户使用页面,点击完成后,会显示下一个引导弹窗,直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...
<6>-MySQL表的增删查改
目录 一,create(创建表) 二,retrieve(查询表) 1,select列 2,where条件 三,update(更新表) 四,delete(删除表…...

从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路
进入2025年以来,尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断,但全球市场热度依然高涨,入局者持续增加。 以国内市场为例,天眼查专业版数据显示,截至5月底,我国现存在业、存续状态的机器人相关企…...
【解密LSTM、GRU如何解决传统RNN梯度消失问题】
解密LSTM与GRU:如何让RNN变得更聪明? 在深度学习的世界里,循环神经网络(RNN)以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而,传统RNN存在的一个严重问题——梯度消失&#…...

STM32HAL库USART源代码解析及应用
STM32HAL库USART源代码解析 前言STM32CubeIDE配置串口USART和UART的选择使用模式参数设置GPIO配置DMA配置中断配置硬件流控制使能生成代码解析和使用方法串口初始化__UART_HandleTypeDef结构体浅析HAL库代码实际使用方法使用轮询方式发送使用轮询方式接收使用中断方式发送使用中…...

【网络安全】开源系统getshell漏洞挖掘
审计过程: 在入口文件admin/index.php中: 用户可以通过m,c,a等参数控制加载的文件和方法,在app/system/entrance.php中存在重点代码: 当M_TYPE system并且M_MODULE include时,会设置常量PATH_OWN_FILE为PATH_APP.M_T…...

wpf在image控件上快速显示内存图像
wpf在image控件上快速显示内存图像https://www.cnblogs.com/haodafeng/p/10431387.html 如果你在寻找能够快速在image控件刷新大图像(比如分辨率3000*3000的图像)的办法,尤其是想把内存中的裸数据(只有图像的数据,不包…...

9-Oracle 23 ai Vector Search 特性 知识准备
很多小伙伴是不是参加了 免费认证课程(限时至2025/5/15) Oracle AI Vector Search 1Z0-184-25考试,都顺利拿到certified了没。 各行各业的AI 大模型的到来,传统的数据库中的SQL还能不能打,结构化和非结构的话数据如何和…...

前端开发者常用网站
Can I use网站:一个查询网页技术兼容性的网站 一个查询网页技术兼容性的网站Can I use:Can I use... Support tables for HTML5, CSS3, etc (查询浏览器对HTML5的支持情况) 权威网站:MDN JavaScript权威网站:JavaScript | MDN...

Linux操作系统共享Windows操作系统的文件
目录 一、共享文件 二、挂载 一、共享文件 点击虚拟机选项-设置 点击选项,设置文件夹共享为总是启用,点击添加,可添加需要共享的文件夹 查询是否共享成功 ls /mnt/hgfs 如果显示Download(这是我共享的文件夹)&…...