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

目录

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

引言

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

通过【前端开发入门】JavaScript快速入门–基本认识 这篇文章的讲解,我希望你已经掌握了基础的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 globalconsole.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.mzph.cn/diannao/57884.shtml

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

相关文章

uniapp 发起post和get请求!uni.request(OBJECT)

在uni-app中&#xff0c;发起HTTP请求主要通过uni.request方法实现。 Get请求 使用uni.request请求api&#xff0c;并且将 method参数设置为GET&#xff0c;有参数的话直接data&#xff1a;{}传递&#xff0c; success是请求成功回调函数&#xff0c;fail是失败函数 <but…

ipv6地址子网划分

IPv6 从左至右一共有8段地址,每一段用16进制表示&#xff0c;共128位。 例如&#xff1a;2001:0DB8:0001:0000:0000:0000:0000:0000 每一段的子网掩码如下&#xff1a; 第1段的掩码为是 0~16 01616 第2段的掩码为是 17~32 161632 第3段的掩码为是 33~48 …

QQ音乐绿钻音效+DTS音效解锁

​ 工具 mt管理器 simplehook QQ音乐&#xff08;自行下载&#xff09; DTS音效修改方法&#xff1a;com.tencent.qqmusic.business.user.a.r1 赋值为1 绿钻音效修改方法&#xff1a; com.tencent.qqmusic.business.user.a.q1 赋值为1 建议使用hook实现&#xff0c;这里贴上si…

动态IP是什么?

随着互联网成为人们生活的重要组成部分&#xff0c;以信息传递为主导的时代种&#xff0c;网络连接质量对我们的工作效率、学习进度以及娱乐体验等方面都有很大影响。 动态IP&#xff0c;作为网络连接中的一种重要IP代理形式&#xff0c;越来越受到用户的欢迎。本文将深入解析…

关于 Linux 内核“合规要求”与俄罗斯制裁的一些澄清

原文&#xff1a;Michael Larabel - 2024.10.24 当 一些俄罗斯的 Linux 开发者被从内核的 MAINTAINERS 文件中移除 时&#xff0c;原因被描述为“合规要求”&#xff0c;但并未明确这些要求具体涉及什么内容。随后&#xff0c;Linus Torvalds 对此发表了评论&#xff0c;明确指…

计算机网络(十二) —— 高级IO

#1024程序员节 | 征文# 目录 一&#xff0c;预备 1.1 重新理解IO 1.2 五种IO模型 1.3 非阻塞IO 二&#xff0c;select 2.1 关于select 2.2 select接口参数解释 2.3 timeval结构体和fd_set类型 2.4 socket就绪条件 2.5 select基本工作流程 2.6 简单select的服务器代…

【Linux】信号量,线程池

目录 信号量 初始化​编辑 销毁 等待 发布 基于环形队列的生产消费模型 问题解答&#xff1a; 代码&#xff1a; 线程池 线程池的实现 &#xff08;1&#xff09;初始化&#xff0c;构造大致框架 &#xff08;2&#xff09;创建线程 &#xff08;3&#xff09;创建任…

Unity 世界空间(World Space)UI被模型遮挡的解决办法(Overlay摄像机)

问题&#xff1a; 想要显示掉落的物品名&#xff0c;但是这个世界空间的UI层会被模型遮挡&#xff0c;如下&#xff1a; 解决&#xff1a; 1.新建一个专门的物品名图层&#xff0c;如ItemUI 2.在主摄像机下新建一个子摄像机ItemCamera&#xff0c;渲染类型设置为Overlay&#…

Unity加载界面制作

效果 UI部分 结构 说下思路: 因为是加载界面,所以最上层是一个Panel阻止所有的UI交互,这个Panel如果有图片就加一个图片,如果没有可以把透明度调到最大,颜色设为黑色. 下面最核心的就是一个进度条了,有图片的话,将进度条的底放进来,将进度条锚点设为下中,将滑动块的尺寸设为0.…

迈威通信西安采矿展大放异彩,驱动煤矿智能转型加速跑

金秋十月&#xff0c;一场矿业技术的盛宴如约而至。10月23日至25日&#xff0c;中国(西安)国际采矿技术交流及设备展览会在西安临空会展中心圆满落下帷幕。迈威通信&#xff0c;作为矿业通信与自动化解决方案的卓越提供商&#xff0c;此次以 “布局多元融合网络&#xff0c;赋能…

SwiftUI 中 List 或 Form 子视图关联的 swipeAction 导致展开动画异常的解决

问题现象 小伙伴们都知道,在 SwiftUI 中更快捷的增强 List 或 Form 子视图(Cell)交互功能的方法是使用 swipeAction 修改器。不过,对其使用稍有不慎也会横生枝节。 如上图所示,不适当的设置 Cell 视图布局会使 swipeAction 无法生成正确的收缩和展开动画。对此我们有什么…

微信小程序文字转语音播报案例

插件申请 在小程序官方申请同声传译插件&#xff0c;地址&#xff1a; mp.weixin.qq.com 引入插件 在app.json中加入 "plugins": {"WechatSI": {"version": "0.3.6","provider": "wx069ba97219f66d99"}},封装…

南京林业大学生态学博士在1区top期刊揭示人工林发育促进土壤团聚体的形成与稳定:对土壤碳氮固存的启示

本文首发于“生态学者”微信公众号&#xff01; 文章信息 第一作者&#xff1a;石珂 通讯作者&#xff1a;阮宏华教授 通讯单位&#xff1a;南京林业大学 原文链接&#xff1a;https://doi.org/10.1016/j.catena.2024.108363 亮点 •土壤团聚体的稳定性随着林分发育而增…

接口测试(五)jmeter——get请求

一、get请求——短信验证码&#xff08;示例仅供参考&#xff09; 1. get请求&#xff1a;传参数据直接拼接在地址后面&#xff0c;jmeter不需要设置请求头content-type 注&#xff1a;短信验证码接口&#xff0c;返回结果中不会返回短信验证码&#xff0c;是存在数据库表中&a…

【C++初阶】一文讲通C++内存管理

文章目录 1. C/C内存分布2. C语言中动态内存管理方式3. C内存管理方式3. 1 new/delete操作内置类型3. 2 new和delete操作自定义类型 4. new与delete的原理4. 1 operator new与operator delete函数4. 2 内置类型4. 3 自定义类型 5. 定位new表达式(placement-new)6. malloc/free和…

校园资讯平台|校园资讯平台系统|基于java和小程序的校园资讯平台设计与实现(源码+数据库+文档)

校园资讯平台 目录 基于java和小程序的校园资讯平台设计与实现 一、前言 二、系统设计 三、系统功能设计 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍&#xff1a;✌️大厂码农|毕设布道师&#xff0c…

【mysql进阶】4-7. 通用表空间

通⽤表空间 - General Tablespace 1 通⽤表空间的作⽤和特性&#xff1f; ✅ 解答问题 通⽤表空间是使⽤ CREATE tablespace 语法创建的共享InnoDB表空间 通⽤表空间能够存储多个表的数据&#xff0c;与系统表空间类似也是共享表空间&#xff1b; 服务器运⾏时会把表空间元数…

【mysql进阶】4-6. InnoDB 磁盘文件

InnoDB 磁盘⽂件 1 InnoDB存储引擎包含哪些磁盘⽂件&#xff1f; &#x1f50d; 分析过程 ✅ 解答问题 InnoDB的磁盘⽂件主要是表空间⽂件和其他⽂件&#xff0c;表空间包括&#xff1a;系统表空间、独⽴表空间、通⽤表空间、临时表空间和撤销表空间&#xff1b;其他⽂件有重做…

springboot入门学习笔记

在我们创建了一个Springboot项目之后&#xff0c;我们会看到有很多文件夹和文件 Springboot程序中各类文件的意义 一.pom.xml 在 Spring Boot 项目中&#xff0c;pom.xml&#xff08;Project Object Model&#xff09;文件是 Maven 构建工具的核心配置文件。起到项目信息定义…

OpenCV中的图像通道合并

在计算机视觉和图像处理领域&#xff0c;OpenCV是一个强大的工具库&#xff0c;它提供了从基本操作到复杂算法的广泛功能。今天&#xff0c;我们将通过一个简单的示例来探索OpenCV中的图像通道处理&#xff0c;特别是如何操作和理解BGR与RGB颜色空间的差异。 Lena图像&#xf…