运算符:运算;有运算,就有结果; 所以以下所有运算符,都有返回值
算术运算符
数学运算符也叫算术运算符,主要包括加、减、乘、除、取余(求模)。
+:求和
-:求差
*:求积
/:求商
%:取模(取余数): 5 % 2 // 1; 5减掉能被2整除的部分,剩余的数 1
2%5 余数2,因为不够除,所以原数剩余2
开发中经常作为某个数字是否被整除,判断当前值是奇数还是偶数
注意点:
🔥当字符串与数字相加时,数字转换为string类型,起到一个拼接的作用;
🔥当相减时,字符串则转换为number类型,即数字相加减。
优先级
- 同时使用多个运算符编写程序时,会按着某种顺序先后执行,我们称为优先级。
JavaScript中 优先级越高越先被执行,优先级相同时以书从左向右执行。- 乘、除、取余优先级相同
加、减优先级相同 - 乘、除、取余优先级大于加、减
- 使用 () 可以提升优先级
总结: 先乘除后加减,有括号先算括号里面的赋值运算符
赋值运算符:对变量进行赋值的运算符
🌈= 将等号右边的值赋予给左边, 要求左边必须是一个变量+= 示例:num = num +10
简化 num +=10
*= 同上
/= 同上
%= 同上
一元运算符
n元运算符定义:根据运算符需要用到的n个操作数
一元运算符做自增运算,只需要1个操作数
操作数:可以操作的数据;数字和变量都是操作数
自增或者自减单独写没有区别,但以后都参与运算有区别自增/自减:
符号:++/—
作用:每执行1次,当前变量的值 +1;作用相当于 变量 +=1
🌈💥💥💥前置自增:先自增后运算
形式:++num
后置自增:先运算后自增
例子:形式:num++
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
</head>
<body>
<script>
let num = 1;
// 前置自增: 先自增,再返回自增结果(会修改num的值); 然后再继续计算
console.log(++num) //2
console.log(num) //2
// 后置自增: 先返回变量的值;然后再自增(会修改num的值); 再根据返回的值继续计算;
console.log( num++) //2
console.log(num) //3
// 重置一下
// 总结:前置和后置自增有没有区别,取决于他们的返回值,有没有被使用
// 前置自减 后置自减
// 作用: -1
// 特性和自增一模一样
// num++2报错
// num++++报错
// 1++ 错误
</script>
</body>
</html>
- 乘、除、取余优先级相同
🔥🔥🔥运算过程:
<script>
let i = 1
console.log(i++ + ++i + i);
// 7返回值 1 + 3 + 3
i后自加=2 i自加=3
临时变量存储1
从左往右依次进行,后置自加不用等整体算完再进行,不要跳过了🔥🔥🔥
</script>
自减:
符号:—
作用:让变量的值 -1
注意事项:
- 只能 +1;
- 有返回值; 运算符就是用来运算并得出运算结果的;
-
使用场景:
经常用于计数来使用。比如进行10次操作,用它来计算进行了多少次了,用来记录循环到第几次了
比较运算符
💥💥💥比较比的都是number类型的,返回值为 boolean类型,true或者false
>: 左边是否大于右边,比较数值大小 <: 左边是否小于右边,比较数值大小 >=: 左边是否大于或等于右边,比较数值大小 <=: 左边是否小于或等于右边,比较数值大小 ==: 左右两边是否相等,将两边的数据进行转换为数值,比较数值大小 ===: 左右两边是否 **类型** 和 **值大小** 都相等 !=: 不等于,比较数值 !==: 左右两边是否不全等,比较数值和类型 比较结果为boolean类型,即只会得到true或false <script> //比较数值大小 console.log(4 > 4) //false console.log(4 < 4) //false console.log(4 >= 4) //true console.log(4 <= 4) //true // == 等于: 只比较 值的大小 console.log(4 == 4) //true // != 不等于:只比较 值的大小 console.log(4 != 4) //false // 比较数据类型和大小 // === 全等: 比较 值的大小 和 类型 console.log(4 === 4) //true console.log(4 === '4')//fasle // !== 不全等:比较 值的大小 和 类型 console.log(4 !== 4) //false console.log(4 !== '4')//true </script>
注意细节:
比较字符串,依靠ASCII码转化成数值,进行比较,先比较第一位;
- 一般数字和字母大的,ASCII编号也大
例如”2”>”19” 返回值true
a的ASCII码为97
- NaN不等于任何值,包括自身,都返回falses ```javascript
- // 尽量不要比较(计算)小数; 小数有精度问题
// 0.1+0.2=0.30000000000004 有小数点后的零零精度
console.log(0.1 + 0.2 === 0.3);//false
// 小数在内存中存储方式,会导致精度问题
// 前端进行计算的时候,使用 计算函数库(别人帮我们写好了的一系列,用于计算的方法)
```
不同类型之间比较会发生隐式转换,最终把数据隐式转换转成number类型再比较
所以开发中,如果进行准确的比较我们更喜欢 === 或者 !==逻辑运算符
用来解决多重条件判断
特点非返回值
&& 逻辑与 并且 符号两边为true,结果为true ; 一假为假false,
直接返回后面的运行结果
|| 逻辑或 或者 有一个为true就为true,一真全真,全假则假
! 逻辑非 取反 true变false;false变true ; 真变假,假变真短路运算:
🔥只存在于 && 和 || 中,当满足一定条件,右边代码不执行(短路)
返回值:无论 && 还是 || ,返回值都是最后被执行的表达式值;
一般用在变量赋值(取默认值)执行+返回值
&& 和 左边为假,右边(短路)不算,总体为假,返回左边值;
左边为真,直接返回右边的值
|| 或 左边为真,右边(短路)不算,总体为真,返回左边值;
左边为假,依次执行右边,直到最后为真,返回右边值
全假返回,最后运算的假值扩展🔥
true 转化为数字 1
false转换为数字0隐式转换:
true ==》 1 false ==》 0<br /> 0 ==》 false 1 ==》 true
💥逻辑上为真的值有:
true 非0数字(包括负数) 非空字符串 {}对象 []数组💥逻辑上为假的值有:
false 0 ‘’ 空字符串 undefined null 还有NaN运算符优先级
- 逻辑与比逻辑或优先级高
- 优先级不等于计算机运行顺序
- 解析顺序不等于运行顺序(可参考短路运算)
表达式
语句
js 整句或命令,用来描述一件事情,代码量比较长
比如: if判断语句 循环语句
语句可以有返回值,但是语句关注点是在做一件事情;
区别
语句 包含 表达式;
但是表达式不等于语句:因为表达式一定有返回值,关注点是值,不是一件事情 ;
程序三大流程控制语句
🌈js整体执行顺序,从上到下,从左到右;这种叫顺序结构;
🔥有的时候要根据条件选择执行代码,这种就叫分支结构
🌈某段代码被重复执行,就叫循环结构
分支语句
if语句
三种使用:单分支、双分支、多分支
单分支: 双分支: 多分支:
🔥条件=表达式: 返回Boolean型 true / false
💥当括号里的条件为true时,进入大括号里执行代码
🔥🔥🔥小括号内的结果若不是布尔类型时,会发生隐式转换转为布尔类型
🎃当处理的代码只有一句,那么也可以省略{},意味着如果没有添加{},
if结构只会影响后面一句; ;代表语句结束了,执行下一句
let num = prompt("请输入数字")
if(num >=60) alert('及格了');console.log(123); 满足条件,弹出及格,打印出123
不满足,打印出123
if(num >=60); alert('及格了');console.log(123);
分号代表语句已经结束,后面依次运行出来,及格了,123
⚡多分支中的 else if条件可以写多个(N)
🌈双分支代码理解:
用户输入年份,判断是闰年还是平年输出;
(能被4整除但不能被100整除,或者被400整除的年份是闰年,否则都是平年)
let year = prompt("请输入年份")
let res1 = year % 4 === 0 && year % 100 !== 0
let res2 = year % 400 === 0
if (res1 || res2) {
alert("闰年")
} else {
alert("平年")
}
🌈多分支代码理解:
<script>
// 多分支语句
// if(表达式){..}else if(表达式){...}else .......
// 需求: 根据输入不同时间,输出不同的问候语
let time = prompt("请输入时间")
if (time < 12) {
alert("上午好")
} else if (time < 18) {
alert("下午好")
} else if (time < 20) {
alert("晚上好")
} else {
alert("开始hi")
}
</script>
switch多分语法
- 分支结构,主流是 if else 结构, switch 也属于分支结构
- 适用场景: case 特别多的时候; 会比 if 看上去更简洁;但if用的更多
- switch 语句计算每个表达式。随后表达式的值会与结构中的每个 case 的值做比较。如果存在匹配,则与该 case 关联的代码块会被执行。
- 可选的
break
语句确保程序立即从相关的 case 子句中跳出 switch 并接着执行 switch 之后的语句。若break
被省略,程序会继续执行switch
语句中的下一条语句。 - 忘记添加 break,那么代码将会从值所匹配的 case 语句开始运行(case穿透),然后持续执行下一个 case 语句而不论值是否匹配。
default 放到其它 case 之上,它仍有效。
语法书写: switch(表达式) { 表达式只计算一次,然后和case的值进行比较 case n: 代码块 break; case n: 代码块 break; default: 默认代码块 }
三元运算符🎃
语法:
条件?满足条件执行的代码 : 不满足条件执行的代码
表达式:有返回值;所以可以用来取值
适用场景: 双分支时使用,更加简洁
相当于: if(条件){ 满足条件执行的代码 } else { 不满足条件执行的代码 }
模板字符串里可以直接写三元运算符表达式🔥🔥🔥扩展:
🔥条件?满足条件执行的代码 : 不满足条件执行的代码(加括号,可以无限嵌套 ? :)
例子:
数字补零案例,例如时钟上的两位数显示 <script> let num = prompt("请输入一个数字") 注意使用 模板字符串🎑💥 let result = num < 10 ? `0${num}` : num document.write(result) </script>
简单计算器 <script> + 使用变成 数字类型 let num1 = +prompt("请输入一个数字") let num2 = +prompt("请输入一个数字") let symbel = prompt("请输入+-*/之一") debugger if (symbel === "+") { alert(num1 + num2) } else if (symbel === "-") { alert(num1 - num2) } else if (symbel === "*") { alert(num1 * num2) } else if (symbel === "/") { alert(num1 / num2) } else { alert("犯规了") } </script>
循环结构
断点调试
🔥🔥🔥debugger 调试断点,多用很重要
进入debugger的条件:网页打开了开发者工具
- js代码运行到了 断点 位置
- 断点可以有两种设置方式
- 在代码中主动写上 debugger,放在循环里面
- 在开发者工具 Sources 选项卡,点击序号
断点:在某句代码上加的标记就叫断点,当程序执行到这句有标记的代码时会暂停下来
过程演示:
- 在Sources选项卡,Scope栏,可以看到当前执行环境(作用域),声明的变量实时的值;
- 选择代码行号,相当与选择断点暂停;运行代码,到断点会停,过程可看Scope,箭头可操作
- 鼠标选中某部分代码,再把鼠标移动到 这部分代码身上; 相当于 执行了一下这部分代码,并且可以看到执行结果(有风险!因为相当于我们人为在代码中,插入了一段代码!)
while循环语法
语法:
while (循环条件) {
要重复执行的代码(循环体)
}一般循环三要素
循环的本质就是以某个变量为起始值,然后不断产生变化量,慢慢靠近终止条件的过程。
🌈while关注点是循环条件: while(条件){…}循环流程:
- 跟if语句很像,都要满足小括号里的条件为true才会进入执行代码
🔥while大括号里代码执行完毕后不会跳出,而是继续回到小括号里判断条件是否满足;
🌈若满足又执行大括号里的代码,然后再回到小括号判断条件,直到括号内条件不满足,即跳出🔥
代码解析:
<script> // 页面输出1-100 // let time = 1; // while (time <= 100) { // document.write(time + "<br>") // time++ // } // 计算从1加到100的总和并输出 let score = 1 let total = 0 while (score <= 100) { total += score score++ } document.write(total) // 计算1-100之间的所有偶数和 let num1 = 0 let num2 = 1 while (num2 <= 100) { if (num2 % 2 === 0) { num1 += num2 } num2++ } console.log('num1: ', num1) </script>
退出循环
在循环体内,使用
continue: 退出当前(本次)循环
break: 退出整个循环