【前端开发入门】JavaScript快速入门--js变量

news2024/10/25 7:54:50

目录

  • 引言
  • 一、为什么要定义变量
  • 二、定义变量的一些技巧
    • 1. 解构赋值
      • 1.1 Object解构赋值
      • 1.2 Array解构赋值
      • 1.3 总结规律
    • 2. 字符串拼接
  • 三、变量作用域
  • 四、总结

引言

本系列教程旨在帮助一些零基础的玩家快速上手前端开发。基于我自学的经验会删减部分使用频率不高的内容,并不代表这部分内容不重要,只是对于初学者来说没必要一开始就学的面面俱到。我希望可以先通过主干内容带大家入门前端,细节技巧性内容,可以在后续的开发工作中自行发现并掌握。

通过【前端开发入门】JavaScript快速入门00 这篇文章的讲解,我希望你已经掌握了基础的js数据类型知识以及简易调试代码的技能。

本篇主要介绍js变量的意义、简单技巧以及作用域概念。


一、为什么要定义变量

解释为什么要定义变量这件事,得先从前端开发的数据交换模式说起。除了极个别纯展示类网站,大多数网站都会动态产生一些数据并更新在页面上。

数据来源通常是:

  1. 网络请求服务器后台得来的数据。
  2. 用户输入产生的数据
  3. 代码运行逻辑中产生的数据。

数据的类型通常是:JSON、String、Number、Boolean、Object、Array、Undefined

以网络请求获取数据为例:后端因为设计逻辑的需求或者后端数据完整性规范需求,通常在给到前端数据时都会有多余的内容。前端需要通过一系列转换最终形成可用数据,呈现在页面上。在日后学习到前端框架例如vue、react等,前端所做的大部分工作都是操作数据,数据会自动和页面dom做绑定,数据变化则页面变化,无需关心如何由数据变换到页面的dom结构。

在这里插入图片描述

既然要经过一系列操作转换数据,那么就需要变量将数据截获,从而在内存中进行运算得出想要结果。
我想到了一个比较有趣的比喻:数据就是好吃的食物,双手就是变量,你本身是前端页面。你不可能手背后伸着脑袋去吃到食物,而是需要双手先接到食物,把食物掰成一口能吃下的大小,然后吃掉。


二、定义变量的一些技巧

在讲解定义变量的技巧前,先明确一个核心点
我们在编写js代码时一定要先定义后使用

错误示例:

console.log(a); // 报错: Cannot access 'a' before initialization
let a = 0;
let b = 1;
add(a, b); // 报错: Cannot access 'add' before initialization
const add = (a, b) => {
  return a + b;
};

修改示例:

let a = 0;
console.log(a); // 输出:0
let b = 1;
const add = (a, b) => {
  return a + b;
};
console.log(add(a, b));// 输出:1

1. 解构赋值

1.1 Object解构赋值

设定一个场景1:发起了一个网络请求,获取了一组JSON格式(也是一种Object)的数据,你需要取出一部分作为你定义函数的传参,然后将函数输出结果渲染到页面上。

现阶段还没介绍网络请求部分(我希望在前端框架处再说),所以我们伪造一个已经请求到的数据,

{
  name: "qbbmnn",
  redBall: 10,
  greenBall: 20,
  blueBall: 30,
}

我需要在页面中展示我的名字以及我手中 redBallgreenBall 总共有多少个

// 解构赋值只取name、redBall、greenBall
const { name, redBall, greenBall} = {
  name: "qbbmnn",
  redBall: 10,
  greenBall: 20,
  blueBall: 30,
};
// 定义处理数据函数
const handleData = (name, redBallNum, greenBallNum) => {
  return {
    name: name,
    allNum: redBallNum + greenBallNum,
  };
};
// 调用处理数据函数,传入待处理的三个变量,将函数return结果赋值给变量result
const result = handleData(name, redBall, greenBall)
// console控制台输出结果result 
console.log(result );// 输出:{name: 'qbbmnn', allNum: 30}

解释下以上代码:

  1. 通过解构赋值的方法定义了三个变量 nameredBallgreenBall,分别对应网络请求获取到数据部分属性的名称,定义的变量值即为对应的属性值。因为存在确定的属性名对应关系,所以在定义变量名时没有顺序关系,可以随意排列。例如:const { redBall,name ,greenBall }
  2. 定义了一个匿名箭头函数,并将函数赋值给变量handleData 。函数具有三个 形参 ,注意这里 形参 和调用函数时传入 实参 的区别。形参可以是任何值,因为函数可以调用多次传入不同值。实参是当前这次调用函数所需要的传值,每次调用函数所用的实参都有可能不同。实参数量可以与形参数量相同,也可以更少,两者从第一位开始匹配依次赋值,当实参数量少时,未被匹配的形参自动赋值为 undefined
  3. 使用result变量承接函数处理完成后的返回值。
  4. 输出result内容。

1.2 Array解构赋值

设定一个场景2:数据和场景1一样,现在需要将redBall刷成greenBall,greenBall刷成blueBall,blueBall刷成redBall,三者互换身份,更新数据。

// 对Object解构赋值定义redBall, greenBall, blueBall
let { redBall, greenBall, blueBall } = {
  name: "qbbmnn",
  redBall: 10,
  greenBall: 20,
  blueBall: 30,
};
// 对Array解构赋值,调换顺序
[redBall, greenBall, blueBall] = [greenBall, blueBall, redBall];
// 输出结果
console.log(redBall); // 输出:20
console.log(greenBall); // 输出:30
console.log(blueBall); // 输出:10

解释下以上代码:

  1. 通过对Object数据解构赋值定义了三个变量 redBallgreenBallblueBall
  2. 将三个变量整合为数组,重新排序,然后通过数组的解构赋值将变量重新赋值。
  3. 注意这里将定义变量时的标识符改为 let ,因为这些变量在后续操作中需要改变。
  4. 输出结果。

1.3 总结规律

从以上两个例子中我们可以得到解构赋值的一些规律

  • 针对Object类型的解构赋值。因为存在键值对的特性,每个属性都有特定的名称,我们无需关心赋值的顺序,只需要名字匹配即可。我们也不关心赋值数量问题,只取自己需要的属性。
  • 针对Array类型的解构赋值。此时为数组排列,只存在序号没有特定的属性名,所以赋值时需要按照顺序赋值,按照等号右侧的顺序依次将值赋予左侧变量。如果等号右侧值数量不够,则赋予左侧多余变量值为 undefined
  • 解构赋值意思就是等号左右两侧拥有相同的数据结构(Object或者Array),将右侧数据对应的赋值给左侧变量。

2. 字符串拼接

设定一个场景3:仍然使用场景1的数据,这次我们要展示一整段字符串,包含所有的信息。

let { name, redBall, greenBall, blueBall } = {
  name: "qbbmnn",
  redBall: 10,
  greenBall: 20,
  blueBall: 30,
};

// 字符串之间通过 + 拼接内容
const message =
  "我是:" +
  name +
  " 我手里有:" +
  redBall +
  "颗红色球," +
  greenBall +
  "颗绿色球," +
  blueBall +
  "颗蓝色球。";
console.log(message); // 输出:我是:qbbmnn 我手里有:10颗红色球,20颗绿色球,30颗蓝色球。

// 模板字符串,使用 ${变量名} 将变量插入字符串中的任意位置,模板字符串用 `` 符号(英文键盘tab上边那个键)包裹起来。
const message2 = `我是:${name } 我手里有:${redBall }颗红色球,${greenBall }颗绿色球,${blueBall }颗蓝色球。`

console.log(message2); // 输出:我是:qbbmnn 我手里有:10颗红色球,20颗绿色球,30颗蓝色球。

目前将变量与字面量字符串拼接的方式,以上两种方式都可以,但是建议使用模板字符串。


三、变量作用域

变量作用域顾名思义变量起作用的区域

按照定义变量的位置可以将变量作用域划分为:全局作用域、函数作用域、块级作用域。
在我眼里变量的作用域只有两种,即全局作用域和块级作用域(不是很严谨但是很好记),判断条件为变量是否定义在 {} 符号内部。外部为全局作用域,内部为块级作用域。

举几个例子:

// 1. globalVar 定义在 {} 外部
const globalVar = "I am globalVar";

// 2. 函数的 {} 从某种意义上也可以算作块级作用域的标志
function test() {
	const functionVar = "I am functionVar"
	console.log(globalVar); // 输出: I am global
  	console.log(functionVar); // 输出: I am functionVar
}
test();
console.log(globalVar); // 输出: "I am global"
console.log(functionVar); // 报错:Uncaught ReferenceError ReferenceError: functionVar is not defined

// 3. 循环体的 {} 当然也被认为是块级作用域的标志
for (let i = 0; i < 10; i++) {
	console.log(globalVar); // 输出 * 10: "I am global"
    console.log(functionVar); // 报错:Uncaught ReferenceError ReferenceError: functionVar is not defined
}


// 4. 极端一些你直接使用 {} 开辟一个块级作用域也是可以的。
{
	const blockVar = "I am blockVar"
	console.log(globalVar); // 输出: "I am global"
	console.log(blockVar); // 输出: "I am blockVar"
	console.log(functionVar); // 报错:Uncaught ReferenceError ReferenceError: functionVar is not defined
}

// 5. 块级作用域的嵌套使用
const globalVar1 = "I am globalVar" 
{
	const globalVar1 = "I am globalVar reset" 
	const blockVar = "I am blockVar"
	const blockFunc = () => {
		const globalVar1 = "I am globalVar reset once again" 
		const blockFuncVar = "I am blockFuncVar "
		console.log(globalVar1); // 输出: "I am globalVar reset once again" 
		console.log(blockVar); // 输出:"I am blockVar"
		console.log(blockFuncVar); // 输出: "I am blockFuncVar "
	}
	blockFunc();
	console.log(globalVar1); // 输出: "I am globalVar reset" 
	console.log(blockVar); // 输出: "I am blockVar"
	console.log(blockFuncVar); // 报错:Uncaught ReferenceError ReferenceError: functionVar is not defined
}

由以上的例子总结出一些规律:

  • 由1、2、3、4可知,定义在全局作用域的变量在任何地方都可以访问到该变量。但是定义在块级作用域内的变量,外层的作用域(此时为全局作用域)无法访问到。
  • 由4、5可知,同一作用域内无法定义相同的变量,但是通过块级作用域的 {} 符号划分出两片作用域,那就可以分别定义相同名字的变量,例如:blockVar
  • 由5可知,变量作用域是具有嵌套效果的。内层可以访问外层变量,外层不能访问内层变量。如果多层级共同定义了同一个变量,那么采取就近原则,读取最靠近当前的作用域内定义的那个变量版本,例如:globalVar1

四、总结

以上即为js定义变量的常见内容,包含Object、Array的解构赋值以及应用场景;定义变量的作用域;虽说是基础常识,但是还是需要在实践中熟悉并掌握,使用它们成为一种习惯。

再接再厉~

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Unity引擎:游戏开发的核心力量

目录 引言 Unity引擎的发展历程 早期发展 跨平台支持 Unity引擎的核心特性 易用性 社区支持 跨平台能力 Unity在游戏开发中的应用 移动游戏 独立游戏 3A游戏 Unity的未来展望 高级图形和渲染技术 扩展现实&#xff08;XR&#xff09;支持 云服务和多人游戏 结论…

C#判断点是否在多边形内

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家&#xff01;人工智能学习网站 前言&#xff1a; 大家好&#xff0c;我是上位机马工&#xff0c;硕士毕业4年年入40万&#xff0c;目前在一家自动化公司担任…

在不支持AVX的linux上使用PaddleOCR

背景 公司的虚拟机CPU居然不支持avx, 默认的paddlepaddle的cpu版本又需要有支持avx才行,还想用PaddleOCR有啥办法呢? 是否支持avx lscpu | grep avx 支持avx的话,会显示相关信息 如果不支持的话,python运行时导入paddle会报错 怎么办呢 方案一 找公司it,看看虚拟机为什么…

logdata-anomaly-miner:一款安全日志解析与异常检测工具

关于logdata-anomaly-miner logdata-anomaly-miner是一款安全日志解析与异常检测工具&#xff0c;该工具旨在以有限的资源和尽可能低的权限运行分析&#xff0c;以使其适合生产服务器使用。 为了确保 logdata-anomaly-miner的正常运行&#xff0c;推荐安装了python > 3.6的…

通过异地组网工具+RustDesk实现虚拟局域网使用远程桌面RDP

通过异地组网工具RustDesk实现虚拟局域网使用远程桌面RDP 预期效果 常见的远程桌面工具就不多说&#xff0c;麻烦而且不好用 QQ 使用普及率高 卡顿、延迟高 TeamViewer 功能强大、兼容性好 官方查询商业用途频繁 向日葵 安全性高、支持多种设备 强制登录、免费用户限速、限…

10. mapreduce实现wordcount

一. mapreduce 概述 mapreduce是一个并行计算框架&#xff0c;它起源于Google的MapReduce论文&#xff0c;它主要用于离线海量数据计算。 优点&#xff1a;海量数据离线处理&#xff0c;开发简单&#xff0c;部署方便缺点&#xff1a;仅适用于批处理&#xff0c;不支持实时数…

二极管那些事儿

一.发光二极管&#xff08;LED&#xff09; 1.压降很大&#xff08;2~3v&#xff09; 二.普通二极管&#xff08;eg:1N4007&#xff09; 1.一般用于整流和续流 2.比较廉价 3.一般压降0.7v 4.可用于防反接电路如下&#xff1a; 三&#xff1a;肖特基 1.开关速度第一&#…

UE5之5.4 第一人称示例代码阅读1 FirstPersonProjectile

既然如此&#xff0c;这几个文件都看看 先看看FirstPersonProjectile头文件 定义了几个函数 然后是两个component 这个projectilemovement应该是控制物理运动的 看看CPP文件 sphere那个就创建了一个subobject&#xff0c;初始化了一下&#xff0c;然后这里 CollisionComp-&g…

【C++差分数组】P10903 商品库存管理

本文涉及知识 C差分数组 洛谷 P10903 商品库存管理 题目简述&#xff1a; 有n中商品&#xff0c;编号[1,n]。有m中操作 ope[i]{LI,RI}&#xff0c;将编号LI到LR的商品都加1。 有m个查询&#xff0c;第i个查询 &#xff0c;执行所有ope[i],i ≠ \neq  i 后为0的商品数。 1…

基于PID控制器和四象限DC-DC功率转换器的永磁直流电机速度控制系统simulink建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 5.完整工程文件 1.课题概述 基于PID控制器和四象限DC-DC功率转换器的永磁直流电机速度控制系统simulink建模与仿真。系统包括电流PI控制器&#xff0c;速度PI控制器&#xff0c;四象限DC-DC功率转换器&am…

Leetcode3. 无重复字符的最长子串

问题描述&#xff1a; 给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的 最长 子串 的长度。 示例 1: 输入: s "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc"&#xff0c;所以其长度为 3。示例 2: 输入: s "bbbbb&q…

Ubuntu 24.04 系统上配置 Node.js 运行环境

本文我们重点介绍两种安装 Node.js 的方法。第一种方法使用 NVM (Node VersionManager)&#xff0c;这是安装和管理多个 Node.js 版本的最好和最快的方法。第二种方法使用官方包存储库在 Ubuntu 上安装 Node.js&#xff0c;一次只允许安装一个版本。 必备条件 A running Ubun…

Java学习Day52:金酬外护遭魔毒,圣显幽魂救本原(验证码补全,新增预约逻辑)

1.验证码补全 //发送验证码sendValidateCode() {/*** 1.手机号不能为空* 2.手机号符合规范* 3.发送一分钟后才可再次发送*///获取手机号let telephone this.orderInfo.telephone;//验证手机号不能空if (telephone undefined){this.$message.error("请输入手机号");…

CentOS 8在Linux虚拟机修改IP地址,出现:错误:“ens160“ 不是活动的连接。错误:未提供活动连接。

问题&#xff1a;错误&#xff1a;"ens160" 不是活动的连接。错误&#xff1a;未提供活动连接。 1.查看网络服务运行状态&#xff1a; 1)CentOS 7执行命令&#xff1a;systemctl status network 2)CentOS 8执行命令&#xff1a;systemctl status NetworkManager&a…

【深度学习基础】详解Pytorch搭建CNN卷积神经网络实现手写数字识别

MNIST 数据集,其包含70000 个2828 的手写数字的数据集,其中又分为60000 个训练样本与10000 个测试样本。 安装实验用到的包 anaconda promt 安装python包, 首先在开始界面打开prompt 进入到相应的虚拟环境中,下面的python38你自己创建的虚拟环境名称。 # 激活虚拟环境,v…

微信小程序中关闭默认的 `navigationBar`,并使用自定义的 `nav-bar` 组件

要在微信小程序中关闭默认的 navigationBar&#xff0c;并使用自定义的 nav-bar 组件&#xff0c;你可以按照以下步骤操作&#xff1a; 1. 关闭默认的 navigationBar 在你的页面的配置文件 *.json 中设置 navigationBar 为 false。你需要在页面的 JSON 配置文件中添加以下代码…

如何在Debian操作系统上安装Doker

本章教程&#xff0c;主要介绍如何在Debian 11 系统上安装Docker。主要使用一键安装Docker脚本和一键卸载脚本来完成。 一、安装Docker #!/bin/bashRED\033[0;31m GREEN\033[0;32m YELLOW\033[0;33m BLUE\033[0;34m NC\033[0mCURRENT_DIR$(cd "$(dirname "$0")…

微知-Linux内核自带的模块被压缩为ko.xz后如何恢复成不压缩版本?(xz -d xxx.ko.xz)

背景 在使用crash定位问题的时候需要使用ko使用对应的符号信息。直接用ko.xz无法正确加载。需要恢复成ko文件。本文介绍如何解压缩。 恢复步骤 在Linux系统中&#xff0c;.xz文件是一种使用LZMA2算法压缩的文件格式。要解压ko.xz文件&#xff0c;你可以使用xz命令行工具。 …

UML外卖系统报告(包含具体需求分析)

1 系统背景 随着互联网技术的快速发展&#xff0c;外卖订餐服务逐渐成为人们生活中的一部分。传统的电话订餐方式面临诸多不便和限制&#xff0c;而基于互联网的外卖订餐系统则提供了更加便捷、快速和高效的订餐服务。这种系统通过将餐厅、顾客和配送人员连接起来&#xff0c;…

职业规划:程序员的成长之路

引言 在快速发展的技术行业中&#xff0c;作为一名程序员&#xff0c;职业规划是至关重要的。从初出茅庐到成为技术专家&#xff0c;每一步都需要明确的目标和不懈的努力。 成长历程 初级阶段&#xff08;0-2年&#xff09; 学习与适应&#xff1a;刚入行时&#xff0c;主要任…