3.1运算符(操作符)
算术运算符:+,-,*,/,%
当对非Number类型的值进行运算时,会将这些值转换成Number然后再运算。
任何值和NaN做运算都是NaN。
两个字符串相加就是拼接字符串(经常会用到)
let result = "我来" + "测试"; //我来测试
// 输出:我来测试
任何值和字符串相加,都会先转换为字符串再拼接。
let result = 123 + "1"; //1231
// 输出:1231
我们可以利用这个特点,后面加上一个空串,对其他数据进行转换,这是一种隐式类型转换。
实际上也是调用了String()函数
let result = 123 + ""; //123
注意一些运算顺序:从左向右算
result = 1 + 2 +"3"; //"33"
result = "1" + 2 + 3; //"123"
任何值做 - * /运算时都会自动转换为Number
可以利用这个特性进行隐式转换
result = "123" - 0; //123
result = "456" * 1; //456
result = "789" / 1; //789
3.1.1一元运算符
-
只有一个操作数 “+”“-”
- "+" 正号对数字没有影响
- "-" 负号可以对数字进行取反
对于非Number类型的值会将其转换为Number再进行运算
可以利用这个特性进行Number类型转换
a = "18";
a = +a; //Number的 18
-
自增(++),自减(- -)
let n1 = 10, n2 = 20; let n = n1++; console.log('n='+n); //10 console.log('n1='+n1); //11 n = ++n1; console.log('n='+n); //12 console.log('n1='+n1); //12 n = n2--; console.log('n='+n); //20 console.log('n2='+n2); //19 n = --n2; console.log('n='+n); //18 console.log('n2='+n2); //18
3.1.2逻辑运算符
&& 与
和短路原则有关
如果第1个值为true,则返回第2个值
如果第1个值为false,则返回第1个值
result = 2 && 3; //3
result = 4 && 6; //6
result = 0 && 3; //0
result = 9 && 0; //0
result = NaN && 0; //NaN
result = 0 && NaN; //0
|| 或
如果第1个值为true,则返回第1个值
如果第1个值为false,则返回第2个值
! 非
都是先将其转换为布尔值再运算
可以进行两次非运算将其转换为布尔值,和调用Boolean()函数一样
“与”“或”运算中有短路逻辑
3.1.3 关系运算符
< , > , <= , >=
非数值数据先将其转换为Number再比较
任何值和NaN比较都是false
符号两边都是字符串的话,不会转换为Number比较,而是比较字符串的Unicode编码
比较字符编码时时一位一位进行比较
如果两位一样,则比较下一位,所以可以借用它来对英文进行排序,比较中文没有意义
注意:
再比较两个字符串数字时,一定要转型!!!
console.log("342" < +"78");
3.1.4 Unicode编码
-
JS使用Unicode编码格式“\u四位16进制数”
console.log("\u2620"); -
网页中使用Unicode编码格式:&#四位十进制数
<h1>☠</h1> -
筛子符号也在Unicode编码里面
3.1.5 相等运算符
- “==”相等
在比较时,大部分情况会转换成Number类型进行比较
console.log("1" == 1); //true
console.log(null == 0); //false
undefined衍生自null,所以他们两个相等
NaN和任何值都不相等,包括他自身
console.log(null == undefined); //true
console.log(NaN == NaN); //false
可以通过isNaN()函数来判断一个值是否为NaN
如果该值是NaN,则返回true,否则返回false。
var b = NaN;
console.log(isNaN(b));
- “!=”不相等
和相等正好是相反的
- “===”全等
和相等类似,不进行自动类型转换
类型和数值一样才返回true
console.log(null === undefined); //false
- “!==”不相等
和不相等类似,不进行自动类型转换
类型和数值一样才返回false
3.1.6 三元运算符
条件表达式?语句1:语句2
条件表达式为true执行语句1,为false执行语句2
非布尔值会转换为布尔值进行比较
3.1.6 运算符优先级
越靠上优先级越高,不用去记忆这个表
遇到优先级不清楚的,可以加括号
3.2 流程控制语句
3.2.1 分支语句
-
If分支
//语法1: if(条件表达式){ //代码块 } //语法2: if(条件表达式){ //代码块 }else{ //代码块 } //语法3: if(条件表达式){ //代码块 }else if(条件表达式) { //代码块 }... -
switch条件分支
switch(条件表达式){ case 表达式: //代码块 break; case 表达式: //代码块 break; default: //代码块 }JS独有的方式,但是和if分支一样
switch(true){ case grade >= 60: console.log("合格"); break; default: console.log("不合格"); }
3.2.2 循环语句
-
while循环
while(条件表达式){ //代码块 } -
Do while循环
do{ // 代码块 }while(条件表达式) -
for循环
for(初始化表达式 ; 条件表达式 ; 更新表达式){ // 代码块 }
3.2.4 Break 和 continue
Continue跳过本次循环,继续执行下一次循环
Break终止当前循环,有嵌套时,终止内层循环
在内层写break 想终止外层循环,可以使用label标识
outer: //label名
for(var i=0; i<10; i++){
console.log("外层循环"+ i);
for(var j=0; j<i; j++){
break outer;
console.log("内层循环"+ j);
}
}
3.2.5 用计时器测试性能
// 在程序开始前,开启计时器
// console.time("计时器的名字") 可以用来开启一个计时器
// 它需要一个字符串作为参数,这个字符串将会作为计时器的标识
console.time("test");
// 需要测试的代码块
//终止计时器
// console.timeEnd() 用来停止一个计时器,需要计时器的名字作为参数
console.timeEnd("test");
3个小练习