JavaScript学习笔记

JavaScript学习笔记
LinstarsJavaScript学习笔记
浏览器执行JS步骤
- 渲染引擎:用来解析HTML和CSS,俗称内核,比如chrome的浏览器的bink,老版本的webkt
- JS引擎:也称为JS解释器。用来读取网页中的JavaScript代码,对其处理后运行,比如chrome的V8
JS的组成
- JavaScript语法
- DOM:页面文档对象模型
- BOM:浏览器对象模型
JS的书写位置
直接书写在元素的内部
1 |
|
内嵌方法写在头部,
1 |
|
需要先新建一个.js文件,文件内容为
直接写这一句就可以了
1 | alter('这是一个弹窗') |
然后在html文件中直接引用
1 |
|
顺带一提,JavaScript中代码行尾不需要加;
分号,除非一行要写多个语句需要加分号,例如
xxxxxxxxxx
html注释
在JavaScript语法中,注释还是以html的注释方法一样的
单行注释
1 | //注释内容 |
多行注释
1 | /* |
输入输出
1 | <head> |
输出结果:
1 | <head> |
弹出框的结果
1 | <head> |
数据类型
javascript的数据类型是动态的,同时也意味着相同的变量可以用作不同的类型
JavaScript 只有一种数字类型。数字可以带小数点,也可以不带
typeof可以用来判断数据类型
1 | var x=6; //为数字型,这是官方叫法 |
极大或极小的数字可以通过科学(指数)计数法来书写:
1 | var y=123e5; // 12300000 |
isNaN可以用来判断非数字,并且返回一个值,注意 一定要区分大小写!!
1 | conosle.log(isNaN(15)); |
返回值false
字符串
定义变量,字符串需要用单引号或双引号包裹着
1 | var a = '我是字符串' |
length
length可以用来检测字符串的长度
1 | var str ='我是\n字符串' |
字符串转义符
类似html里面的特殊字符,转义符都是以\开头的,
常用的转义符
转义符 | 解释说明 |
---|---|
\n |
换行符,n是newline的意思 |
\\ |
斜杠\ |
\' |
‘ 单引号 |
\" |
“ 双引号 |
\t |
tab 缩进 |
\b |
空格,b是blank的意思 |
字符串的拼接
1 | console.log('这里是字符串1'+'字符串2') |
1输出结果:这里是字符串1字符串2
2输出结果:1+1=2
Boolean
布尔型boolean是可以参与计算的,即true为1,false为0,这样在后期进行判断的时候就会很方便
例如:
1 | var bool1=true |
输出结果
1输出结果:2
2输出结果:1
undefined
一个未定义的变量未赋值,就是undefined未定义数据类型
如果手动给一个变量值为undefined,那么他也是未定义的数据类型
例如
1 | var a = undefined |
输出也是undefined
扩展:
1 | console.log(a+'pink') //输出结果是字符串拼接undpinkdefine |
null
空值null
1 | var c=null |
数据类型的转换
转为字符串型
方式 | 说明 | 案例 |
---|---|---|
toString() | 转为字符串 | var num=1;alert(num.toString()) |
String()强制转换 | 转为字符串 | var num=1;alert(String(num)) |
加号拼接字符串 | 和字符串拼接的结果都是字符串 | var num=1;alert(num+”我是字符串”) |
1 | //转为字符串型 toString |
点击查看控制台输出结果
转换为数字型
方式 | 说明 | 案例 |
---|---|---|
parselnt(string)函数 | 讲string类型转成整数数值型 | parselnt(‘78’) |
parseFloat(string)函数 | 讲string类型转成浮点数数值型 | parseFloat(‘78.21’) |
Number()强制转换函数 | 讲string类型转换为数值型 | Number(‘78.21’) |
js隐式转换(- * /) | 利用算数运算隐式转换为数值型 | ‘12’-0 |
代码
1 | //数字类型的转换,将字符型转换为数字型 |
转换为布尔型
方式 | 说明 | 案例 |
---|---|---|
Boolean()函数 | 其他类型转成布尔值 | Boolean(‘true’) |
- 代表空、否定的值会被转换为false,如”、0、NaN、null、nudefined
- 其余值都会被转换为true
如:
1 | console.log(Boolean('')); //false |
运算符与表达式
运算符的优先级
优先级 | 运算符 | 顺序 |
---|---|---|
1 | 小括号 | () |
2 | 一元运算符 | ++ -- ! |
3 | 算术运算符 | 先* / % 后+ - |
4 | 关系运算符 | > >= < <= |
5 | 相等运算符 | == != === !== |
6 | 逻辑运算符 | 先&& 后 ` |
7 | 赋值运算符 | = |
8 | 逗号运算符 | , |
if语句
if 的语法结构
1 | if (条件表达式) { |
执行思路 如果 if 里面的条件表达式结果为真 true 则执行大括号里面的 执行语句
1 | // 如果if 条件表达式结果为假 则不执行大括号里面的语句 则执行if 语句后面的代码 |
if双分支语句
1 | // 语法结构 if 如果 else 否则 |
执行思路 如果表达式结果为真 那么执行语句1 否则 执行语句2
1 | var age = prompt('请输入您的年龄:'); |
多分支语句
就是利用多个条件来选择不同的语句执行 得到不同的结果 多选1 的过程
if else if语句是多分支语句
1 | if (条件表达式1) { |
执行思路
如果条件表达式1 满足就执行 语句1 执行完毕后,退出整个if 分支语句
如果条件表达式1 不满足,则判断条件表达式2 满足的话,执行语句2 以此类推
如果上面的所有条件表达式都不成立,则执行else 里面的语句
注意
- 多分支语句还是多选1 最后只能有一个语句执行
- else if 里面的条件理论上是可以任意多个的
- else if 中间有个空格了
判断成绩案例
// 伪代码 按照从大到小判断的思路
// 弹出prompt输入框,让用户输入分数(score),把这个值取过来保存到变量中
// 使用多分支 if else if 语句来分别判断输出不同的值
var score = prompt('请您输入分数:');
if (score >= 90) {
alert('宝贝,你是我的骄傲');
} else if (score >= 80) {
alert('宝贝,你已经很出色了');
} else if (score >= 70) {
alert('你要继续加油喽');
} else if (score >= 60) {
alert('孩子,你很危险');
} else {
alert('熊孩子,我不想和你说话,我只想用鞭子和你说话');
}
例题判断闰年
算法:
- 能被4整除且不能整除100的为闰年(如2004年就是闰年,1901年不是闰年)或者能够被 400 整除的就是闰年
- 弹出prompt 输入框,让用户输入年份,把这个值取过来保存到变量中
- 使用 if 语句来判断是否是闰年,如果是闰年,就执行 if 大括号里面的输出语句,否则就执行 else里面的输出语句
- 一定要注意里面的且 && 还有或者 || 的写法,同时注意判断整除的方法是取余为 0
1 | var year = prompt('请您输入年份:'); |
三元表达式
有三元运算符组成的式子我们称为三元表达式
++num 3 + 5 ? :
语法结构
条件表达式 ? 表达式1 : 表达式2
执行思路
如果条件表达式结果为真 则 返回 表达式1 的值 如果条件表达式结果为假 则返回 表达式2 的值
1 | var num = 10; |
案例数字补零
用户输入0~59之间的一个数字
如果数字小于10,则在这个数字前面补0,(加0 拼接) 否则 不做操作
用一个变量接受这个返回值,输出
1 | var time = prompt('请您输入一个 0 ~ 59 之间的一个数字'); |
swich语句
switch 语句也是多分支语句 也可以实现多选1
语法结构
switch 转换、开关 case 小例子或者选项的意思
1 | switch (表达式) { |
执行思路
利用我们的表达式的值 和 case 后面的选项值相匹配 如果匹配上,就执行该case 里面的语句 如果都没有匹配上,那么执行 default里面的语句
代码验证
1 | switch (8) { |
switch注意事项
- 我们开发里面 表达式我们经常写成变量
- 我们num 的值 和 case 里面的值相匹配的时候是 全等 必须是值和数据类型一致才可以 num === 1
- break 如果当前的case里面没有break 则不会退出switch 是继续执行下一个case
1 | var num = 1; |
查询水果案例
1 | // 弹出 prompt 输入框,让用户输入水果名称,把这个值取过来保存到变量中。 |
循环
for循环
for 重复执行某些代码, 通常跟计数有关系
for 语法结构
1
2
3for (初始化变量; 条件表达式; 操作表达式) {
// 循环体
}
初始化变量 就是用var 声明的一个普通变量, 通常用于作为计数器使用
条件表达式 就是用来决定每一次循环是否继续执行 就是终止的条件
操作表达式 是每次循环最后执行的代码 经常用于我们计数器变量进行更新(递增或者递减)
代码体验
我们重复打印100遍 你好
1 | for (var i = 1; i <= 100; i++) { |
while循环
while 循环语法结构
while 当…的时候
1 | while (条件表达式) { |
执行思路
当条件表达式结果为true 则执行循环体 否则 退出循环
代码验证
1 | var num = 1; |
里面应该也有计数器 初始化变量,应该也有操作表达式 完成计数器的更新 防止死循环
do while循环
do while 循环 语法结构
1 | do { |
执行思路 跟while不同的地方在于 do while 先执行一次循环体 在判断条件 如果条件表达式结果为真,则继续执行循环体,否则退出循环,do while 循环体至少执行一次
代码验证
1 | var i = 1; |
do while循环案例
1 | // 1. 打印人的一生,从1岁到100岁 |
continue
continue 关键字 退出本次(当前次的循环) 继续执行剩余次数循环
1 | for (var i = 1; i <= 5; i++) { |
求1~100 之间, 除了能被7整除之外的整数和
1 | var sum = 0; |
break
1 | // break 退出整个循环 |
数组
数组(Array) :就是一组数据的集合 存储在单个变量下的优雅方式
利用new 创建数组
1 | var arr = new Array(); // 创建了一个空的数组 |
利用数组字面量创建数组 []
1 | var arr = []; // 也可以创建一个空的数组 |
- 我们数组里面的数据一定用逗号分隔
- 数组里面的数据 比如1,2, 我们称为数组元素
- 获取数组元素 格式 数组名[索引号] 索引号从 0开始
遍历数组
遍历数组:就是把数组的元素从头到尾访问一次
1 | var arr = ['red', 'green', 'blue']; |
因为我们的数组索引号从0开始 ,所以 i
必须从 0开始 i < 3
输出的时候 arr[i] i
计数器当索引号来用
数组长度
数组长度 数组名.length
数组的长度是元素个数 不要跟索引号混淆arr.length
动态监测数组元素的个数
1 | var arr = ['关羽', '张飞', '马超', '赵云', '黄忠', '刘备', '姜维', 'pink']; |
计算数组的和以及平均值
需求:求数组 [2,6,1,7, 4] 里面所有元素的和以及平均值。
- 声明一个求和变量 sum。
- 遍历这个数组,把里面每个数组元素加到 sum 里面。
- 用求和变量 sum 除以数组的长度就可以得到数组的平均值。
1 | var arr = [2, 6, 1, 7, 4]; |
求数组最大值
求数组[2,6,1,77,52,25,7]中的最大值
- 声明一个保存最大元素的变量 max。
- 默认最大值可以取数组中的第一个元素。
- 遍历这个数组,把里面每个数组元素和 max 相比较。
- 如果这个数组元素大于max 就把这个数组元素存到 max 里面,否则继续下一轮比较。
- 最后输出这个 max
1 | var arr = [2, 6, 1, 77, 52, 25, 7, 99]; |
数组转化为字符串
需求:将数组 [‘red’, ‘green’, ‘blue’, ‘pink’] 转换为字符串,并且用 | 或其他符号分割
- 需要一个新变量用于存放转换完的字符串 str。
- 遍历原来的数组,分别把里面数据取出来,加到字符串里面。
- 同时在后面多加一个分隔符
1 | var arr = ['red', 'green', 'blue', 'pink']; |
新增数组元素
新增数组元素 修改length长度
1 | // 1. 新增数组元素 修改length长度 |
数组存放十个值
新建一个数组,里面存放10个整数( 1~10)
核心原理:使用循环来追加数组。
- 声明一个空数组 arr。
- 循环中的计数器 i 可以作为数组元素存入。
- 由于数组的索引号是从0开始的, 因此计数器从 0 开始更合适,存入的数组元素要+1。
1 | var arr = []; |
筛选数组
将数组 [2, 0, 6, 1, 77, 0, 52, 0, 25, 7] 中大于等于 10 的元素选出来,放入新数组。
- 声明一个新的数组用于存放新数据newArr。
- 遍历原来的旧数组, 找出大于等于 10 的元素。
- 依次追加给新数组 newArr。
1 | var arr = [2, 0, 6, 1, 77, 0, 52, 0, 25, 7]; |
1 | var arr = [2, 0, 6, 1, 77, 0, 52, 0, 25, 7]; |
数组去重
将数组[2, 0, 6, 1, 77, 0, 52, 0, 25, 7]中的 0 去掉后,形成一个不包含 0 的新数组。
- 需要一个新数组用于存放筛选之后的数据。
- 遍历原来的数组, 把不是 0 的数据添加到新数组里面(此时要注意采用数组名 + 索引的格式接收数据)。
- 新数组里面的个数, 用 length 不断累加。
1 | var arr = [2, 0, 6, 1, 77, 0, 52, 0, 25, 7]; |
翻转数组
将数组 [‘red’, ‘green’, ‘blue’, ‘pink’, ‘purple’] 的内容反过来存放
- 声明一个新数组 newArr
- 把旧数组索引号第4个取过来(arr.length - 1),给新数组索引号第0个元素 (newArr.length)
- 我们采取 递减的方式
i--
1 | var arr = ['red', 'green', 'blue', 'pink', 'purple', 'hotpink']; |
交换两个变量
1 | var num1 = 'pink'; |
冒泡排序
1 | // var arr = [5, 4, 3, 2, 1]; |
函数
函数使用
函数使用分为两步: 声明函数 和 调用函数
声明函数
1 | function 函数名() { |
1 | function sayHi() { |
- function 声明函数的关键字 全部小写
- 函数是做某件事情,函数名一般是动词 sayHi
- 函数不调用自己不执行
调用函数
1 | // 函数名(); |
调用函数的时候千万不要忘记加小括号
利用函数计算1-100之间的累加和
1 | // 1. 声明函数 |
带参数的函数
函数可以重复相同的代码
1 | function cook() { |
我们可以利用函数的参数实现函数重复不同的代码
1 | function 函数名(形参1,形参2...) { // 在声明函数的小括号里面是 形参 (形式上的参数) |
形参和实参的执行过程
1 | function cook(aru) { // 形参是接受实参的 aru = '酸辣土豆丝' 形参类似于一个变量 |
函数的参数可以有,也可以没有个数不限
利用函数求任意两个数的和
1 | function getSum(num1, num2) { |
利用函数求任意两个数之间的和
1 | function getSums(start, end) { |
注意点
- 多个参数之间用逗号隔开
- 形参可以看做是不用声明的变量
函数形参实参个数匹配
1 | function getSum(num1, num2) { |
如果实参的个数和形参的个数一致 则正常输出结果getSum(1, 2);
如果实参的个数多于形参的个数 会取到形参的个数getSum(1, 2, 3);
如果实参的个数小于形参的个数 多于的形参定义为undefined
最终的结果就是 NaN
形参可以看做是不用声明的变量 num2
是一个变量但是没有接受值 结果就是undefined
getSum(1); // NaN
建议:我们尽量让实参的个数和形参相匹配
函数的返回值
函数是做某件事或者实现某种功能
1 | function cook(aru) { |
函数的返回值格式
1 | // function 函数名() { |
- 我们函数只是实现某种功能,最终的结果需要返回给函数的调用者函数名() 通过return 实现的
- 只要函数遇到return 就把后面的结果 返回给函数的调用者 函数名() = return后面的结果
代码验证
1 | function getResult() { |
求任意两个数的和
1 | function getSum(num1, num2) { |
求两个数最大值
利用函数 求两个数的最大值
1 | function getMax(num1, num2) { |
求数组中最大值
利用函数求数组 [5,2,99,101,67,77] 中的最大数值
1 | function getArrMax(arr) { // arr 接受一个数组 arr = [5,2,99,101,67,77] |
arguments 的使用
只有函数才有 arguments对象 而且是每个函数都内置好了这个arguments
伪数组 并不是真正意义上的数组
- 具有数组的 length 属性
- 按照索引的方式进行存储的
- 它没有真正数组的一些方法 pop() push() 等等
1 | function fn() { |
利用函数求任意个数的最大值
1 | function getMax() { // arguments = [1,2,3] |
利用函数翻转任意数组 reverse 翻转
1 | function reverse(arr) { |
利用函数冒泡排序
1 | // 利用函数冒泡排序 sort 排序 |
利用函数判断闰年
1 | // 利用函数判断闰年 |
函数是可以相互调用的
1 | // 函数是可以相互调用的 |
输出年份的2月份天数
1 | // 用户输入年份,输出当前年份2月份的天数 |
1 | // 判断是否为闰年的函数 |
函数的两种声明方式
1 | // 1. 利用函数关键字自定义函数(命名函数) |
JavaScript作用域
- JavaScript作用域 : 就是代码名字(变量)在某个范围内起作用和效果 目的是为了提高程序的可靠性更重要的是减少命名冲突
- js的作用域(es6)之前 : 全局作用域 局部作用域
- 全局作用域: 整个script标签 或者是一个单独的js文件
1 | var num = 10; |
变量的作用域
变量的作用域: 根据作用域的不同我们变量分为全局变量和局部变量
- 全局变量: 在全局作用域下的变量 在全局下都可以使用
注意:如果在函数内部 没有声明直接赋值的变量也属于全局变量
1 | var num = 10; // num就是一个全局变量 |
- 局部变量 在局部作用域下的变量 后者在函数内部的变量就是 局部变量
注意: 函数的形参也可以看做是局部变量
1 | function fun(aru) { |
- 从执行效率来看全局变量和局部变量
(1) 全局变量只有浏览器关闭的时候才会销毁,比较占内存资源
(2) 局部变量 当我们程序执行完毕就会销毁, 比较节约内存资源
js没有块级作用域
js的作用域: 全局作用域 局部作用域 现阶段我们js 没有 块级作用域
我们js 也是在 es6 的时候新增的块级作用域
块级作用域 {} if {} for {}
1 | // 块级作用域 {} if {} for {} |