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:圆形的圆心位置坐标。 …...

国防科技大学计算机基础课程笔记02信息编码
1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制,因此这个了16进制的数据既可以翻译成为这个机器码,也可以翻译成为这个国标码,所以这个时候很容易会出现这个歧义的情况; 因此,我们的这个国…...
三维GIS开发cesium智慧地铁教程(5)Cesium相机控制
一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点: 路径验证:确保相对路径.…...

从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路
进入2025年以来,尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断,但全球市场热度依然高涨,入局者持续增加。 以国内市场为例,天眼查专业版数据显示,截至5月底,我国现存在业、存续状态的机器人相关企…...
【JavaSE】绘图与事件入门学习笔记
-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角,以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向,距离坐标原点x个像素;第二个是y坐标,表示当前位置为垂直方向,距离坐标原点y个像素。 坐标体系-像素 …...

2025季度云服务器排行榜
在全球云服务器市场,各厂商的排名和地位并非一成不变,而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势,对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析: 一、全球“三巨头”…...

sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!
简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求,并检查收到的响应。它以以下模式之一…...

iview框架主题色的应用
1.下载 less要使用3.0.0以下的版本 npm install less2.7.3 npm install less-loader4.0.52./src/config/theme.js文件 module.exports {yellow: {theme-color: #FDCE04},blue: {theme-color: #547CE7} }在sass中使用theme配置的颜色主题,无需引入,直接可…...
智能职业发展系统:AI驱动的职业规划平台技术解析
智能职业发展系统:AI驱动的职业规划平台技术解析 引言:数字时代的职业革命 在当今瞬息万变的就业市场中,传统的职业规划方法已无法满足个人和企业的需求。据统计,全球每年有超过2亿人面临职业转型困境,而企业也因此遭…...

QT开发技术【ffmpeg + QAudioOutput】音乐播放器
一、 介绍 使用ffmpeg 4.2.2 在数字化浪潮席卷全球的当下,音视频内容犹如璀璨繁星,点亮了人们的生活与工作。从短视频平台上令人捧腹的搞笑视频,到在线课堂中知识渊博的专家授课,再到影视平台上扣人心弦的高清大片,音…...

Matlab实现任意伪彩色图像可视化显示
Matlab实现任意伪彩色图像可视化显示 1、灰度原始图像2、RGB彩色原始图像 在科研研究中,如何展示好看的实验结果图像非常重要!!! 1、灰度原始图像 灰度图像每个像素点只有一个数值,代表该点的亮度(或…...