黑马程序员JavaScript语法ECMAscript入门
参考B站视频:黑马程序员前端JavaScript入门到精通全套视频教程
JavaScript 基础 - 第1天

了解变量、数据类型、运算符等基础概念,能够实现数据类型的转换,结合四则运算体会如何编程。
- 体会现实世界中的事物与计算机的关系
- 理解什么是数据并知道数据的分类
- 理解变量存储数据的“容器”
- 掌握常见运算符的使用,了解优先级关系
- 知道 JavaScript 数据类型隐式转换的特征
介绍
掌握 JavaScript 的引入方式,初步认识 JavaScript 的作用

引入方式
JavaScript 程序不能独立运行,它需要被嵌入 HTML 中,然后浏览器才能执行 JavaScript 代码。通过 script 标签将 JavaScript 代码引入到 HTML 中,有两种方式:
内部方式
通过 script 标签包裹 JavaScript 代码
|
外部形式
一般将 JavaScript 代码写在独立的以 .js 结尾的文件中,然后通过 script 标签的 src 属性引入
// demo.js |
|
如果 script 标签使用 src 属性引入了某 .js 文件,那么 标签的代码会被忽略!!!如下代码所示:
|
注释和结束符
通过注释可以屏蔽代码被执行或者添加备注信息,JavaScript 支持两种形式注释语法:
单行注释
使用 // 注释单行代码
|
多行注释
使用 /* */ 注释多行代码
|
注:编辑器中单行注释的快捷键为 ctrl + /
结束符
在 JavaScript 中 ; 代表一段代码的结束,多数情况下可以省略 ; 使用回车(enter)替代。
|
实际开发中有许多人主张书写 JavaScript 代码时省略结束符 ;
输入和输出
输出和输入也可理解为人和计算机的交互,用户通过键盘、鼠标等向计算机输入信息,计算机处理后再展示结果给用户,这便是一次输入和输出的过程。
举例说明:如按键盘上的方向键,向上/下键可以滚动页面,按向上/下键这个动作叫作输入,页面发生了滚动了这便叫输出。
输出
JavaScript 可以接收用户的输入,然后再将输入的结果输出:
alert()、document.wirte()
以数字为例,向 alert() 或 document.write()输入任意数字,他都会以弹窗形式展示(输出)给用户。
输入
向 prompt() 输入任意内容会以弹窗形式出现在浏览器中,一般提示用户输入一些内容。
|
变量
理解变量是计算机存储数据的“容器”,掌握变量的声明方式
变量是计算机中用来存储数据的“容器”,它可以让计算机变得有记忆,通俗的理解变量就是使用【某个符号】来代表【某个具体的数值】(数据)
<script> |
声明
声明(定义)变量有两部分构成:声明关键字、变量名(标识)
|
关键字是 JavaScript 中内置的一些英文词汇(单词或缩写),它们代表某些特定的含义,如 let 的含义是声明变量的,看到 let 后就可想到这行代码的意思是在声明变量,如 let age;
let 和 var 都是 JavaScript 中的声明变量的关键字,推荐使用 let 声明变量!!!
赋值
声明(定义)变量相当于创造了一个空的“容器”,通过赋值向这个容器中添加数据。
|
关键字
JavaScript 使用专门的关键字 let 和 var 来声明(定义)变量,在使用时需要注意一些细节:
以下是使用 let 时的注意事项:
- 允许声明和赋值同时进行
- 不允许重复声明
- 允许同时声明多个变量并赋值
- JavaScript 中内置的一些关键字不能被当做变量名
以下是使用 var 时的注意事项:
- 允许声明和赋值同时进行
- 允许重复声明
- 允许同时声明多个变量并赋值
大部分情况使用 let 和 var 区别不大,但是 let 相较 var 更严谨,因此推荐使用 let,后期会更进一步介绍二者间的区别。
变量名命名规则
关于变量的名称(标识符)有一系列的规则需要遵守:
只能是字母、数字、下划线、$,且不能能数字开头
字母区分大小写,如 Age 和 age 是不同的变量
不能用关键字,JavaScript 内部已占用于单词(关键字或保留字)不允许使用
规范
- 尽量保证变量具有一定的语义,见字知义
- 遵循小驼峰命名法
注:所谓关键字是指 JavaScript 内部使用的词语,如 let 和var,保留字是指 JavaScript 内部目前没有使用的词语,但是将来可能会使用词语。
|
常量
概念:使用 const 声明的变量称为“常量”。
使用场景:当某个变量永远不会改变的时候,就可以使用 const 来声明,而不是let。
命名规范:和变量一致
const PI = 3.14 |
注意: 常量不允许重新赋值,声明的时候必须赋值(初始化)
数据类型
计算机世界中的万事万物都是数据。
计算机程序可以处理大量的数据,为了方便数据的管理,将数据分成了不同的类型:
分为两大类,基本数据类型、引用数据类型!
注:通过 typeof 关键字检测数据类型
|
数值类型
即我们数学中学习到的数字,可以是整数、小数、正数、负数
|
JavaScript 中的数值类型与数学中的数字是一样的,分为正数、负数、小数等。
算术运算 ——数值的运用
算术符号:
+、-、*、/、%
多个符号同时使用的优先级:
先乘除余,再加减,有括号先算括号内的
NaN:not a number
当在运算过程中,出现一个计算错误,就会返回NaN,代表一个不正确的运算结果!
NaN具有粘性,任何计算加上NaN,返回NaN,并且NaN不等于NaN!
字符串类型
通过单引号( '') 、双引号( "")或反引号包裹的数据都叫字符串,单引号和双引号没有本质上的区别,推荐使用单引号。
注意事项:
- 无论单引号或是双引号必须成对使用
- 单引号/双引号可以互相嵌套,但是不以自已嵌套自已
- 必要时可以使用转义符
\,输出单引号或双引号
字符拼接:
- 使用
+,连接两个字符串! - 使用
+,连接一个字符串和一个数值,数值也会当中字符串,最后拼接一起 - 字符串中,使用变量,利用规则1、2,口号”引引加加”!或者使用模板字符串
模板字符串:拼接字符串和变量
- 必须是反引号包裹字符串
- 变量名使用${}包裹
|
布尔类型
表示肯定或否定时在计算机中对应的是布尔类型数据,它有两个固定的值 true 和 false,表示肯定的数据用 true,表示否定的数据用 false。
|
undefined
未定义是比较特殊的类型,只有一个值 undefined,只声明变量,不赋值的情况下,变量的默认值为 undefined,一般很少【直接】为某个变量赋值为 undefined。
|
注:JavaScript 中变量的值决定了变量的数据类型。
类型检测
使用typeof关键字检测数据类型,返回被检测的数据类型:
- 使用运算符:typeof 数据
- 函数形式:typeof(数据)
类型转换
理解弱类型语言的特征,掌握显式类型转换的方法
在 JavaScript 中数据被分成了不同的类型,如数值、字符串、布尔值、undefined,在实际编程的过程中,不同数据类型之间存在着转换的关系。
比如prompt(),输入的值默认是字符串,如果预想的是输入数字相加,然后输出加法结果,实际上是字符串的拼接,连起来的数字字符串!
隐式转换

某些运算符被执行时,系统内部自动将数据类型进行转换,这种转换称为隐式转换。
|
注:数据类型的隐式转换是 JavaScript 的特征,后续学习中还会遇到,目前先需要理解什么是隐式转换。
补充介绍模板字符串的拼接的使用
显式转换
编写程序时过度依靠系统内部的隐式转换是不严禁的,因为隐式转换规律并不清晰,大多是靠经验总结的规律。为了避免因隐式转换带来的问题,通常根逻辑需要对数据进行显示转换。
Number
Number():
通过 Number 显示转换成数值类型,当转换失败时结果为 NaN(Not a Number)即不是一个数字。
也就是说,要能转化的值,使用这个函数才好使!
|
parse系列:
- parseInt():把数字开头的字符,取其整数部分,转化为整数!
- parseFloat():把数字开头的字符,识别到第一个点,及其后的数字部分,转化为小数!
转换为布尔值——真假

Boolean();
字符只有空为假
数值只有0为假
undefined、不是一个数字NaN、空null、[][0]是假!
总结:变量与数据类型!
JavaScript 基础 - 第2天

理解什么是流程控制,知道条件控制的种类并掌握其对应的语法规则,具备利用循环编写简易ATM取款机程序能力
- 运算符
- 语句
- 综合案例
运算符
算术运算符
数字是用来计算的,比如:乘法 * 、除法 / 、加法 + 、减法 - 等等,所以经常和算术运算符一起。
算术运算符:也叫数学运算符,主要包括加、减、乘、除、取余(求模)等
| 运算符 | 作用 |
|---|---|
| + | 求和 |
| - | 求差 |
| * | 求积 |
| / | 求商 |
| % | 取模(取余数),开发中经常用于作为某个数字是否被整除 |
注意:在计算失败时,显示的结果是 NaN (not a number)
// 算术运算符 |
赋值运算符
赋值运算符:对变量进行赋值的运算符
= 将等号右边的值赋予给左边, 要求左边必须是一个容器
| 运算符 | 作用 |
|---|---|
| += | 加法赋值 |
| -+ | 减法赋值 |
| *= | 乘法赋值 |
| /= | 除法赋值 |
| %= | 取余赋值 |
<script> |
自增/自减运算符
| 符号 | 作用 | 说明 |
|---|---|---|
| ++ | 自增 | 变量自身的值加1,例如: x++ |
| – | 自减 | 变量自身的值减1,例如: x– |
- ++在前和++在后在单独使用时二者并没有差别,而且一般开发中我们都是独立使用
- ++在后(后缀式)我们会使用更多
注意:
- 只有变量能够使用自增和自减运算符
- ++、– 可以在变量前面也可以在变量后面,比如: x++ 或者 ++x
<script> |
比较运算符
使用场景:比较两个数据大小、是否相等,根据比较结果返回一个布尔值(true / false)
| 运算符 | 作用 |
|---|---|
| > | 左边是否大于右边 |
| < | 左边是否小于右边 |
| >= | 左边是否大于或等于右边 |
| <= | 左边是否小于或等于右边 |
| === | 左右两边是否类型和值都相等(重点) |
| == | 左右两边值是否相等 |
| != | 左右值不相等 |
| !== | 左右两边是否不全等 |
<script> |
数字间可以比较,字符间也可以比较,按照ASCII码值比较!
- 单个字符串,
- 多个字符串,逐字比较,如果第一位相等,再比较第二位!姓氏排名可以使用!
NaN什么运算,都返回false或者NaN
尽量不要比较小数,涉及精度问题
- 先乘10的阶乘,去掉小数部分
- 再除10的阶乘,恢复成小数,就可以解决精度!得到原值!
逻辑运算符
使用场景:可以把多个布尔值放到一起运算,最终返回一个布尔值
| 符号 | 名称 | 日常读法 | 特点 | 口诀 |
|---|---|---|---|---|
| && | 逻辑与 | 并且 | 符号两边有一个假的结果为假 | 一假则假 |
| || | 逻辑或 | 或者 | 符号两边有一个真的结果为真 | 一真则真 |
| ! | 逻辑非 | 取反 | true变false false变true | 真变假,假变真 |
| A | B | A && B | A || B | !A |
|---|---|---|---|---|
| false | false | false | false | true |
| false | true | false | true | true |
| true | false | false | true | false |
| true | true | true | true | false |
<script> |
逻辑中断
也就是逻辑运算符里的短路,只存在于 && 和 || 中!
特点:&&是一假则假,只要前面的值是假,后面的表达式不执行
||是一真则真,只要前面的值是真,后面的表达时不执行
并且,&&两边都为真值时,返回的右边的真值,||前面是真值,返回左边的真值,如果都是假,返回右边的假值
运算符优先级

逻辑运算符优先级: !> && > ||
语句
表达式和语句

分支语句
分支语句可以根据条件判定真假,来选择性的执行想要的代码
分支语句包含:
- if分支语句(重点)
- 三元运算符
- switch语句
if 分支语句
语法:
if(条件表达式) { |
小括号内的条件结果是布尔值,为 true 时,进入大括号里执行代码;为false,则不执行大括号里面代码
小括号内的结果若不是布尔类型时,会发生类型转换为布尔值,类似Boolean()
如果大括号只有一个语句,大括号可以省略,但是,俺们不提倡这么做~
<script> |
if双分支语句
如果有两个条件的时候,可以使用 if else 双分支语句
if (条件表达式){ |
例如:
<script> |
if 多分支语句
使用场景: 适合于有多个条件的时候
按顺序筛选,后续的条件默认是在前面的条件不满足的情形下再筛选!所以条件中可以省略重复条件
<script> |
三元运算符(三元表达式)
使用场景: 一些简单的双分支,可以使用 三元运算符(三元表达式),写起来比 if else双分支 更简单,符号:? 、: 配合使用
语法:
条件 ? 表达式1 : 表达式2 |
特殊在于,不仅可以利用返回值,还可以用来执行语句(也就是在表达式中,嵌入执行语句!)
主要应用:还是为了取值!毕竟是表达式!
例如:
// 三元运算符(三元表达式) |
switch语句(了解)
使用场景: 适合于有多个条件的时候,也属于分支语句,大部分情况下和 if多分支语句 功能相同
注意:
- switch case语句一般用于等值判断, if适合于区间判断
- switchcase一般需要配合break关键字使用 没有break会造成case穿透
- if 多分支语句开发要比switch更重要,使用也更多
例如:
// switch分支语句 |
断点调试
作用:学习时可以帮助更好的理解代码运行,工作时可以更快找到bug
浏览器打开调试界面
- 按F12打开开发者工具
- 点到源代码一栏 ( sources )
- 选择代码文件
断点:在某句代码上加的标记就叫断点,当程序执行到这句有标记的代码时会暂停下来

循环语句
使用场景:重复执行 指定的一段代码,比如我们想要输出10次 ‘我学的很棒’
学习路径:
1.while循环
2.for 循环(重点)
while循环
while : 在…. 期间, 所以 while循环 就是在满足条件期间,重复执行某些代码。
语法:
while (条件表达式) { |
例如:
// while循环: 重复执行代码 |
循环三要素:
以某个变量为起始值,然后不断产生变化,慢慢靠近终止条件的过程!
1.初始值 (经常用变量)
2.终止条件
3.变量的变化量
例如:
<script> |
中止循环
break 中止整个循环,一般用于结果已经得到, 后续的循环不需要的时候可以使用(提高效率)
continue 中止本次循环,一般用于排除或者跳过某一个选项的时候
一般用于,在循环体中间,设置独立条件,跳出循环,或者在无限循环中,设置跳出循环的条件
<script> |
无限循环
1.while(true) 来构造“无限”循环,需要使用break退出循环。(常用)
2.for(;;) 也可以来构造“无限”循环,同样需要使用break退出循环。
// 无限循环 |
综合案例-ATM存取款机

分析:
①:提示输入框写到循环里面(无限循环)
②:用户输入4则退出循环 break
③:提前准备一个金额预先存储一个数额 money
④:根据输入不同的值,做不同的操作
(1) 取钱则是减法操作, 存钱则是加法操作,查看余额则是直接显示金额
(2) 可以使用 if else if 多分支 来执行不同的操作
完整代码:
<script> |
总结:表达式与控制流程结构的语句
JavaScript 基础第三天笔记

if 多分支语句和 switch的区别:
共同点
- 都能实现多分支选择, 多选1
- 大部分情况下可以互换
区别:
- switch…case语句通常处理case为比较确定值的情况,而if…else…语句更加灵活,通常用于范围判断(大于,等于某个范围)。
- switch 语句进行判断后直接执行到程序的语句,效率更高,而if…else语句有几种判断条件,就得判断多少次
- switch 一定要注意 必须是 === 全等,一定注意 数据类型,同时注意break否则会有穿透效果
- 结论:
- 当分支比较少时,if…else语句执行效率高。
- 当分支比较多时,switch语句执行效率高,而且结构更清晰。
for 语句
掌握 for 循环语句,让程序具备重复执行能力
for 是 JavaScript 提供的另一种循环控制的话句,它和 while 只是语法上存在差异。
for语句的基本使用
- 实现循环的 3 要素
<script> |
变化量和死循环,
for循环和while一样,如果不合理设置增量和终止条件,便会产生死循环。跳出和终止循环
与while()循环不一样的是,while是遇到Continue语句时,跳转到条件判断,而for遇到continue语句时,跳转到i自增(改变循环变量)!也就是说就不用再提前在退出语句前加改变循环变量,防止卡死
<script> |
结论:
JavaScript提供了多种语句来实现循环控制,但无论使用哪种语句都离不开循环的3个特征,即起始值、变化量、终止条件,做为初学者应着重体会这3个特征,不必过多纠结三种语句的区别。- 起始值、变化量、终止条件,由开发者根据逻辑需要进行设计,规避死循环的发生。
- 当如果明确了循环的次数的时候推荐使用
for循环,当不明确循环的次数的时候推荐使用while循环
注意:
for的语法结构更简洁,故for循环的使用频次会更多。
for遍历数组
起始值为0,变化为1,终止为数组长度,使用for循环可以非常简单的遍历数组!
循环嵌套
利用循环的知识来对比一个简单的天文知识,我们知道地球在自转的同时也在围绕太阳公转,如果把自转和公转都看成是循环的话,就相当于是循环中又嵌套了另一个循环。

实际上 JavaScript 中任何一种循环语句都支持循环的嵌套,如下代码所示:

// 1. 外面的循环 记录第n天 |
记住,外层循环循环一次,里层循环循环全部
- 外层的循环初始化,只执行了一遍,然后就是循环条件、循环体、变化值的重复执行
- 内存循环,在新的一轮中,重置循环初始值,所以,外层循环一次,内存循环全部次数!
- 在特殊条件下,改变循环体中的变化值,可以让一次循环次数改变!
循环三要素,改变其中任一项,就可以改变循环次数!
倒三角
改变内层循环的循环条件,改成外层的循环变量!或者与之相关,从而调整到想要的循环次数!
// 外层打印几行 |

九九乘法表
样式css
span { |
javascript
// 外层打印几行 |

数组
知道什么是数组及其应用的场景,掌握数组声明及访问的语法。
数组是什么?
数组:(Array)是一种可以按顺序保存数据的数据类型
使用场景:如果有多个数据可以用数组保存起来,然后放到一个变量中,管理非常方便
数组的基本使用
定义数组和数组单元
<script> |
通过 [] 定义数组,数据中可以存放真正的数据,如小明、小刚、小红等这些都是数组中的数据,我们这些数据称为数组单元,数组单元之间使用英文逗号分隔。
访问数组和数组索引
使用数组存放数据并不是最终目的,关键是能够随时的访问到数组中的数据(单元)。其实 JavaScript 为数组中的每一个数据单元都编了号,通过数据单元在数组中的编号便可以轻松访问到数组中的数据单元了。
我们将数据单元在数组中的编号称为索引值,也有人称其为下标。
索引值实际是按着数据单元在数组中的位置依次排列的,注意是从 0 开始的,如下图所示:

观察上图可以数据单元【小明】对应的索引值为【0】,数据单元【小红】对应的索引值为【2】
<script> |
数据单元值类型
数组做为数据的集合,它的单元值可以是任意数据类型
<script> |
数组长度属性
重申一次,数组在 JavaScript 中并不是新的数据类型,它属于对象类型。
<script> |
用数组解决的问题
求和
累加
求最大值和最小值
解决思路:打擂台
优化上述代码:if语句,三目表达式等
操作数组
增删改查!
查:
就是遍历数组,或者把数组内的值,当中变量的值,通过数组名[索引],的方式进行增、改、查
改:
和变量一样,可以从新赋值,或者在原值基础上修改后,再赋值!比如拼接字符!
增方法:
数组做为对象数据类型,不但有 length 属性可以使用,还提供了许多方法:
- push 动态向数组的尾部添加一个单元,并返回数组的新长度
- unshit 动态向数组头部添加一个单元,并返回数组的新长度
删方法:
- pop 删除最后一个单元,返回改元素的值
- shift 删除第一个单元
- splice 动态删除任意单元
使用以上4个方法时,都是直接在原数组上进行操作,即成功调任何一个方法,原数组都跟着发生相应的改变。并且在添加或删除单元时 length 并不会发生错乱。
<script> |
数据筛选
就像再超市里挑水果,在原数数组中,遍历数组,找出满意的数据,把取出的值,追加到新数组中!
案例:打印生产值
案例:按照输入值,显示柱状图
.data_table { |
// 根据数据生成柱状图 |

总结:for循环和数组
JavaScript 基础 - 第4天笔记

理解封装的意义,能够通过函数的声明实现逻辑的封装,知道对象数据类型的特征,结合数学对象实现简单计算功能。
- 理解函数的封装的特征
- 掌握函数声明的语法
- 理解什么是函数的返回值
- 知道并能使用常见的内置函数
函数
理解函数的封装特性,掌握函数的语法规则
函数就是一段封装的代码,也就相当于个盒子,其中存储了一段代码,重要的不仅是函数本身,而是这段代码的作用,以及函数与这段代码中的配合!
这段代码需要完成一件事情,那么不需要传入值,也不需要传出值,那么就是存储代码块而已!实现代码复用!
如果一段函数,可以传入值,并且可以传出结果,那么这就涉及到函数的功能了,可以引入局部变量,可以返回值!
传入值,就能让函数内部的关键量得到变化,通用性更强,一种方法,解决多种问题!
与变量一样,先声明——存入代码,再调用
声明和调用
函数可以把具有相同或相似逻辑的代码“包裹”起来,通过函数调用执行这些被“包裹”的代码逻辑,这么做的优势是有利于精简代码方便复用。
声明(定义)
声明(定义)一个完整函数包括关键字、函数名、形式参数、函数体、返回值5个部分

调用
声明(定义)的函数必须调用才会真正被执行,使用 () 调用函数。——调用核心竟然是小括号!
|
注:函数名的命名规则与变量是一致的,并且尽量保证函数名的语义。
小案例: 小星星
<script> |
参数
通过向函数传递参数,可以让函数更加灵活多变,参数可以理解成是一个变量。
传入值,就能让函数内部的关键量得到变化,通用性更强,一种方法,解决多种问题!
声明(定义)一个功能为打招呼的函数
- 传入数据列表
- 声明这个函数需要传入几个数据
- 多个数据用逗号隔开
|
总结:
- 声明(定义)函数时的形参没有数量限制,当有多个形参时使用
,分隔 - 调用函数传递的实参要与形参的顺序一致
形参和实参
形参:声明函数时写在函数名右边小括号里的叫形参(形式上的参数)
实参:调用函数时写在函数名右边小括号里的叫实参(实际上的参数)
形参可以理解为是在这个函数内声明的变量(比如 num1 = 10)实参可以理解为是给这个变量赋值
开发中尽量保持形参和实参个数一致
|
参数的默认值
如果带有形参,但不赋值,调用函数时容易报错!
这时可以赋值形参初始值(x=0, y=0),这样改进的函数更严谨
这个默认值,只会在缺少实参参数的情况下,才会执行,有参数会优先执行参数!都没有则是未定义
传入的参数类型
直接量、数组、变量都是可以的!
返回值
函数的本质是封装(包裹),函数体内的逻辑执行完毕后,函数外部如何获得函数内部的执行结果呢?要想获得函数内部逻辑的执行结果,需要通过 return 这个关键字,将内部执行结果传递到函数外部,这个被传递到外部的结果就是返回值。
|
细节总结:
- 在函数体中使用return 关键字能将内部的执行结果交给函数外部使用
- 函数内部只能出现1 次 return,并且 return 下一行代码不会再被执行,所以return 后面的数据不要换行写
- return会立即结束当前函数
- 函数可以没有return,这种情况默认返回值为 undefined
函数细节补充
- 两个相同的函数,后面的函数会覆盖前面的函数!
- JS允许实参和形参个数不一致,少了则自动添上未定义,多了则忽略!
- 可以使用return语句,提前结束函数!
作用域
通常来说,一段程序代码中所用到的名字(变量)并不总是有效和可用的,而限定这个名字的可用性的代码范围,就是这个名字的作用域。
作用域的使用提高了程序逻辑的局部性,增强了程序的可靠性,减少了名字冲突。
全局作用域
作用于所有代码执行的环境(整个 script 标签内部)或者一个独立的 js 文件
处于全局作用域内的变量,称为全局变量
局部作用域
作用于函数内的代码环境,就是局部作用域。 因为跟函数有关系,所以也称为函数作用域。
处于局部作用域内的变量称为局部变量
如果函数内部,变量没有声明,直接赋值,也当全局变量看,但是强烈不推荐
但是有一种情况,函数内部的形参可以看做是局部变量。
for语句中的变量,是for的局部变量
匿名函数
函数可以分为具名函数和匿名函数
匿名函数:没有名字的函数,无法直接使用。
函数表达式
// 声明 |
立即执行函数
两种写法:
- 第一个括号把函数包起来,第二个括号,相当于调用函数,可以出入实参!
- 只用一个括号包起来,在函数体结束后面加个小括号
(function(){ xxx })(); |
无需调用,立即执行,其实本质已经调用了
多个立即执行函数之间用分号隔开
在能够访问到的情况下 先局部 局部没有在找全局
补充
逻辑中断
只存在于&& 、||中
&&一假则假,||一真则真,返回最后判断的值!布尔转换
使用Boolean()
隐式转换:
‘’ - 2 返回-2
null + 1 ,返回1,null转换成0
null == undefined ,返回true
- 无法转换:
undefined + 1,返回NaN
‘大家好’ - 1,返回NaN
‘NaN’ + 1,返回NaN
JavaScript 基础 - 第5天

知道对象数据类型的特征,能够利用数组对象渲染页面
- 理解什么是对象,掌握定义对象的语法
- 掌握数学对象的使用
对象
对象是 JavaScript 数据类型的一种,之前已经学习了数值类型、字符串类型、布尔类型、undefined。对象数据类型可以被理解成是一种数据集合。它由属性和方法两部分构成。
与数组类似,占据一大段空间,内部数据间存在关系,无序数据,相当于变量的集合,这些数据的集合,称为对象类型!
可以存放变量和函数,对应一种事物具有的属性和功能!相当于现实世界的工具,对这件工具的描述
语法
声明一个对象类型的变量,与之前声明一个数值 的变量,没有本质上的区别。
|
属性
数据描述性的信息称为属性,如人的姓名、身高、年龄、性别等,一般是名词性的。
在对象外边的变量叫做变量,在对象内部的变量叫做属性!
- 属性都是成 对出现的,包括属性名和值,它们之间使用英文
:分隔 - 多个属性之间使用英文
,分隔 - 属性就是依附在对象上的变量
- 属性名可以使用
""或'',一般情况下省略,除非名称遇到特殊符号如空格、中横线等
|
属性的增删改查
属性是对象中的变量,对变量的增改查,由于在属性中,所以使用点,这个操作符,就像数组访问内部使用[],对象访问内部的数据使用.
增、改、查,与变量一样,重新赋值就是,没有这个属性,自动就添加这个属性名和值!删delete
对象不仅是在一个容器中,存在变量和函数,并且,还具有特殊功能!比如使用一些关键字,来操作对象的数据,不用使用let关键字就能分配空间容纳数据!
声明对象,并添加了若干属性后,可以使用 . 或 [] 获得对象中属性对应的值,我称之为属性访问。
特别的
当属性名通过字符串命名,也就是加上''、""时,使用['']来访问这个属性!
|
扩展:也可以动态为对象添加属性,动态添加与直接定义是一样的,只是语法上更灵活。
|
方法和调用
存储代码块,函数功能,相当于函数表达式,把函数存放在对象内部,通过属性名去使用这个函数!
数据行为性的信息称为方法,如跑步、唱歌等,一般是动词性的,其本质是函数。
- 方法是由方法名和函数两部分构成,它们之间使用 : 分隔
- 多个属性之间使用英文
,分隔 - 方法是依附在对象中的函数
- 方法名可以使用
""或'',一般情况下省略,除非名称遇到特殊符号如空格、中横线等
|
声明对象,并添加了若干方法后,可以使用 . 或 [] 调用对象中函数,我称之为方法调用。
注意必须加上,小括号,这才代表函数,并可以传递参数!
|
扩展:也可以动态为对象添加方法,动态添加与直接定义是一样的,只是语法上更灵活。
|
注:无论是属性或是方法,同一个对象中出现名称一样的,后面的会覆盖前面的。
null
null 也是 JavaScript 中数据类型的一种,通常只用它来表示不存在的对象。使用 typeof 检测类型它的类型时,结果为 object。
遍历对象
为什么不适用for遍历,原因一、对象无长度属性、数据间无序!
使用for i in obj,for/in语法;但是这个k,是字符串类型,所以操作数组时存在隐患!
不推荐遍历数组,推荐用来遍历对象!
let obj = { |
for in 不提倡遍历数组 因为 k 是 字符串
遍历属性名
通过k,可以访问属性名
遍历属性值
不能通过对象.k访问数组,因为会识别成,访问对象中属性名为k的属性值!
并且,因为k是字符串,所以对象.k是无法正确访问,而对象[k]合适,访问对象是这样设计!
遍历数组对象的属性
对象相当于一个事物、工具等,不同的工具事物,比如一个班级的人,人又有行为和属性,那么可以使用数组中放置对象
for循环访问外层数组,使用数组名[i].属性名,来或取每一个数组中的属性!
内置对象
回想一下我们曾经使用过的 console.log,console其实就是 JavaScript 中内置的对象,该对象中存在一个方法叫 log,然后调用 log 这个方法,即 console.log()。
除了 console 对象外,JavaScritp 还有其它的内置的对象
Math——数学对象
与数字相关的很多方法和属性,比如随机数、向上取整、向下取整、四舍五入!math.xxx()
Math 是 JavaScript 中内置的对象,称为数学对象,这个对象下即包含了属性,也包含了许多的方法。
属性
- Math.PI,获取圆周率
// 圆周率 |
方法
- Math.random,生成 0 到 1 间的随机数
// 0 ~ 1 之间的随机数, 包含 0 不包含 1 |
- Math.ceil,数字向上取整
// 舍弃小数部分,整数部分加1 |
- Math.floor,数字向下取整
// 舍弃小数部分,整数部分不变 |
- Math.round,四舍五入取整
// 取整,四舍五入原则 |
- Math.max,在一组数中找出最大的
// 找出最大值 |
- Math.min,在一组数中找出最小的
// 找出最小值 |
- Math.pow,幂方法
// 求某个数的多少次方 |
- Math.sqrt,平方根
// 求某数的平方根 |
数学对象提供了比较多的方法,这里不要求强记,通过演示数学对象的使用,加深对对象的理解。
生成任意指定范围的随机数
利用math数学对象中的random()方法,math.random()返回[0,1)包括0,不包括1的随机数!
由于小数部分涉及到16位,所以取到0的值的概率是千万亿分之一,忽略不计!
1到10之间的整数
可以忽略0,把(0,1)之间的数均匀放大11倍,也就是分成11份!然后向下取整,就能把11份儿分给11个值![0,1,2,3,4,5,6,7,8,9,10]
//获取随机数 |
简写成:
Math.floor(Math.random()*11); |
总结,获取0~X之间的随机数,Math.random()*(X+1),再向下取整!
0到任意范围之间的数
从数组中随机取值,arr[Math.floor(Math.random()*(arr.length))];
Math.floor(Math.random()*(终值+1)); |
任意范围之间的数(N,M)
把0到任意范围在数轴上移动!
- 确认范围大小,也就是M-N
- 移动范围,范围+N
//从N~M差值的整数,比如23~28的差值是5,那就取0~5之间的整数 |
Math.floor(N+Math.random()*(M-N+1)); |
案例:随机点名
let arr = ['赵云', '黄忠', '关羽', '张飞', '马超', '刘备', '曹操'] |
猜数字
while(true){ |
限制次数,把内存while改成for,并调用循环变量值,输出提醒用户剩余次数!
或者使用开关变量,来对结束分类,是次数用完结束,还是猜对了结束!
while(true){ |
优化代码中选择的数据类型,可以优化代码,简洁美观!
优化算法类型,可以有效优化代码!
随机颜色
如果输入true,输出#xxxxxx格式,如果是false,输出rgb(xxx,xxx,xxx)格式!
- 利用函数和返回值,作为输出结果
- 利用输入作为选择
- 利用字符串拼接或者追加的方式,先创建0到f的数组,或者字符串,随机取数,用来拼接成新数组:
[#].push(arr[Math.random()])
JS小结
概念名词:
关键字、保留字、标识符、表达式、语句
数据类型:
基本类型(简单类型、值类型)、引用类型(复杂类型)的存储方式!
基本类型在存储时,变量中存储的是值本身,因此叫做值类型!
引用类型在存储时,变量中存储的是地址,因此叫做引用数据类型!
计算机内存中分为堆和栈
- 栈:简单值存放在栈里面
- 堆:引用数据类型存放在堆里面

案例

实际上JS并不完善,并没有栈和堆,但是可以通过这样理解基本类型和引用数据类型!ts就有!




