3.3.3 比较运算符
比较运算符,是两个数据进行比较时所使用的运算符,比较运算后,会返回一个布尔值(true / false)作为运算结果。
// 普通比较运算符 < > >= <= == // 不会比较数据类型 (18 == '18' 为真) === // 会比较数据类型 != !== // 全不等(包括数据类型)
- 比较运算符两侧表达式先转为布尔型再进行比较
- '0' 用 Boolen() 做判断的时候是 true,但是用 == 比较运算符和布尔值比较的时候 '0' 是 false,但 '0' == 0 是真
- undefined 和 null 在 Boolen() 做判断的时候是 flase,但是用 == 比较的时候他们不等于 false
- NaN 和任何值都不相等,包括它本身,即 NaN == NaN 为假
3.3.4 逻辑运算符
逻辑运算符 | 说明 |
&& | 逻辑与 |
|| | 逻辑或 |
! | 逻辑非 |
- 如果只是普通逻辑运算(两侧都是布尔型),返回的还是布尔型
- 与 undefined, null 做 && 运算返回 undefined, null
- !1 返回 false
3.3.5 逻辑运算短路
逻辑与运算短路
// 当表达式1和2为真时,返回表达式2 console.log(123 && 456); // 返回456 // 当表达式1为假时,直接返回表达式1 console.log(0 && 456); // 返回0
逻辑或运算短路
// 当表达式1为真,则返回表达式1 // 当表达式1为假,则返回表达式2 var num = 1; console.log(123 || num++); console.log(num); // 1
3.3.6 赋值运算符
num += 2; // 相当于 num = num + 2 num -= 1; num *= 1; num /= 1;
3.3.7 运算符优先级
运算符 | 结合性 | 优先级 |
.、[ ]、( ) | 从左到右 | 最高 |
++、--、-、!、new、typeof | 从右到左 | |
*、/、% | 从左到右 | |
+、- | 从左到右 |
<、<=、>、>=、in、instanceof | 从左到右 | |
==、!=、===、!== | 从左到右 | |
&& | 从左到右 | |
II | 从左到右 | |
?: | 从右到左 | |
=、*=、/=、%=、+=、-=、&=、^=、!= | 从右到左 | |
, | 从左到右 | 最低 |
任何写这种式子的人都是神经病:
var s = 4 >= 6 || 'a' != 'b' && !(12 * 2 == 144) && true console.log(s) // true
- 赋值运算符优先级最低,先不用看它
- 然后是逻辑运算符 || 和 &&,从左到右开始
- 4 >= 6 为 false,所以看右侧返回值
- 右侧的三个 && 返回的都是 true,最后表达式返回 true
如果最右侧表达式是数值的话,则返回数值
3.4 流程控制
3.4.1 顺序结构
A -> B -> C
3.4.2 选择结构
3.4.2.1 if 分支结构
单分支结构
if (条件表达式) { // 执行语句 } // 其他代码
- 当条件表达式为真时,程序进入分支,执行完毕后,继续执行其他代码
- 当条件表达式为假时,程序直接跳过条件分支,执行其他代码
双向分支
if (条件表达式) { // 执行语句 } else { // 执行语句 }
// 其他代码
- 当条件表达式为真时,程序进入分支,执行完毕后,继续执行其他代码
- 当条件表达式为假时,程序执行 else 代码块中的代码,执行完毕后再执行其他代码
多分支结构
if (条件表达式1) { // 执行语句1 } else if (条件表达式2) { // 执行语句2 } else { // 执行语句3 }
// 其他代码
- 如果满足条件表达式1,则执行执行语句1,直接跳出
- 如果不满足,则判断条件表达式2,为真则执行语句2,不为真则去执行 else
多分支语句只是多选一,最后只有一个语句执行
例:判断分数
var score = promot('请输入分数:') if (score >= 90) { alert('优') } else if (score >= 80) { alert('良') } else if (score >= 60) { alert('中') } else { alert('差') }
3.4.2.2 三元运算符
如果条件表达式结果为真,则返回表达式1,的值,否则返回表达式2的值
条件表达式 ? 表达式1 : 表达式2
//输入一个 0~59 数字,如果小于10,则在数字前边补0 var time = prompt('请输入一个0~59的数字'); console.log(time<10 ? '0' + time : time);
3.4.2.3 Switch
switch(表达式){ case value1: // 执行语句1 break; case value2: // 执行语句2 break; default: // 如果无条件满足,最终执行语句 }
开发中表达式通常写为变量,变量值需要和 case 的 value 值全匹配,值和数据必须完全一致
Switch 与 IF 区别
- switch...case 语句通常处理 case 为比较确定值的情况,if...else语句通常用于范围判断(大于、小于)
- switch 语句进行条件判断直接跳转到case,效率更高,if 语句是顺序判断,效率低
3.5 循环结构
3.5.1 for 循环
for(初始化变量; 条件表达式; 操作表达式){ // 循环体 }
// 初始化变量: 用 var 声明的一个普通变量,通常用于计数器使用
// 条件表达式: 用来判断每一次循环是否继续执行,是终止的条件
// 操作表达式: 是每次循环最后执行的代码,经常用于计数器变量的更新(递增或递减)
例:输出一百句你好
for(var i = 1; i<=100; i++){ console.log('你好'); }
例:从0加到100
var sum =0; for(var i = 1; i<=100; i++){ sum+=i; }
3.5.2 嵌套循环
for (外层循环初始化变量; 外层循环表条件达式; 外层操作表达式){ for(内层循环初始化变量; 内层循环表条件达式; 内层操作表达式){ // 循环代码 } }
外层循环一次,内层循环执行全部
例:输出 5x5 的 *
var str = ""; for (var i = 1; i <= 5; i++) { for (var j = 1; j <= 5; j++) { str = str + "*"; } str = str + "\n"; } console.log(str);
3.5.3 while 循环
while(条件表达式){ // 循环体 }
例:用 while 实现从1加到100
var num=1; while(num<=100){ console.log(num); num++; }
while 循环一般需要配一个计数器,然后再循环体内设置一个终止循环,否则会陷入死循环
3.5.4 do while 循环
do { // 循环体 } while(条件表达式)
和 while 循环比,do while 循环至少需要执行一次,然后进行判断是否终止循环。
3.5.5 continue 和 break
- break 关键字用于直接跳出循环
- continue 关键字用于立即跳出本次循环,进入下一次循环
3.5.6 断点调试
在 Chrome 中 F12 进入调试模式,进入 Sources,在代码行数下断点,然后刷新则会进入到断点
3.6 数组
数组可以把一组相关的数据一起存放,并提供方便的访问方式。
3.6.1 创建数组
// 利用对象创建数组 var arr = new Array(); // 利用 [] 快捷创建数组 var arr = []; var arr = [1, 2, 3, 'Pink', True];
3.6.2 访问数组元素
数组可以通过索引来访问、设置、修改对应的数组元素,可以通过 “数组名[索引]“ 的方式来获取数组中的元素。
var arr1 = ['张三', '李四', '王五', '淑芬']; // 索引号: 0 1 2 3 console.log(arr1); // 输出整个数组所有元素 console.log(arr1[0]); // 使用 数组名[索引号] 获取数组数组内指定元素的值
3.6.3 遍历数组
arr= ['a', 'b', 'c', 'd']; for (var i = 0; i <= 3; i++) { console.log(arr[i]); }
3.6.4 数组长度属性 length
arr= ['a', 'b', 'c', 'd']; console.log(arr.length); // 输出4
利用 length 添加新的数组元素
arr = ["a", "b", "c", "d"]; arr[arr.length] = 'e'; console.log(arr[arr.length - 1]); // 输出结果 e
3.6.5冒泡排序
var arr = [5, 4, 3, 2, 1]; for (var i = 0; i < arr.length - 1; i++) { // 外层循环 for (var j = 0; j <= arr.length - i - 1; j++) { if (arr[j] > arr[j + 1]) { var temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } } console.log(arr);
3.7 函数
3.7.1 声明函数
// 声明函数 function 函数名(){ // 函数内部代码,又称为函数体 } // 调用函数 函数名();
例:将1~100 累加封装成函数
function sum(){ var sum = 0; for(var i=1; i<=100; i++){ sum = sum+i; } console.log(sum); } sum();
3.8 作用域
全局变量:
- 变量在
<script>
标签之内,或者是一个单独js文件 - 如果在函数内部没有声明的变量也属于全局变量(即在函数内部可以使用外部的变量)
- 浏览器关闭才会销毁
局部变量:
- 变量声明在函数内部
- 函数的形参也可以看做是局部变量
- 函数执行完毕就会销毁
链式作用域:
- 函数内部可以调用父集中的变量
1. var n