操作符
学习目标:掌握各种操作符的用法
- 操作符:也叫运算符,是js中发起运算最简单的方式
- 表达式(expression):组成包含操作数和操作符,表达式会得到一个结果,然后用结果参与程序。
算术运算符
- + - * / % ()
- %:取余,取模。即:a/b = c 余 d,就是说a%b=d
- 运算顺序:先乘除,后加减,有小括号先算小括号
正常情况
数字与数字之间的运算
console.log(1 * 2);
非正常情况1
有特殊字面量(NaN、infinity)参与的运算
- NaN参与的运算:得到的结果都是NaN
- Infinity参与的运算,视情况而定
console.log(Infinity * Infinity); //infinity
console.log(Infinity / Infinity); //NaN
console.log(Infinity + Infinity); //infinity
console.log(Infinity - Infinity); //NaN
console.log(Infinity % Infinity); //NaN
console.log(Infinity * 8); //infinity
console.log(Infinity / 8); //infinity
console.log(Infinity + 8); //infinity
console.log(Infinity - 8); //infinity
console.log(Infinity % 8); //NaN
console.log(-Infinity * 8); //-infinity
console.log(-Infinity / 8); //-infinity
console.log(-Infinity + 8); //-infinity
console.log(-Infinity - 8); //-infinity
console.log(-Infinity % 8); //NaN
console.log(5 / Infinity); //0
console.log(5 % Infinity); //5
- 总结:工作中并不会使用特殊值运算,没有实际应用的意义,但是要了解,以防面试遇到。
非正常情况2
其他数据类型参与数学运算
- 有字符串参与的+运算:+号变为连字符将前后连接成整体字符串。
- 隐式转换:除了字符串参与的+运算,其他情况下,所有其他数据类型参与数学运算时,计算机暗中将其他数据类型先自动转换成数字类型,再参与运算,这个过程中不需要使用parseInt()、Number()等方法,过程是暗中进行,这就是一个隐式转换的过程。
隐式转换
其他的数据类型会隐式转换为数字类型:
- 对应数字:纯数字字符串会转为对应的数字"123" → 123
- 转换为1 → true
- 转换为0 → false、null、空字符串、空白字符串
- 转换为NaN → undefined、非空非纯数字字符串
比较运算符
- 也叫关系运算符。一个比较运算符comparison operator比较它的操作数并返回一个布尔类型值。运算结果要么是true,要么是false > 大于 < 小于 >= 大于等于 <= 小于等于 == 相等,只判断值大小是否相等,不判断数据类型 != 不等,与相等完全相反 === 全等,不光判断值相等,还要判断数据类型相等 !== 不全等,与全等于完全相反
正常情况
数字与数字比较
非正常情况1
特殊值(NaN、infinity)参与比较运算
- NaN参与:不等于和不全等于结果是true,其他的都得到false
- infinity参与的运算,视情况而定: 规定infinity == infinity(为:true)
console.log(Infinity > Infinity); //false
console.log(Infinity >= Infinity); //true
console.log(Infinity < Infinity); //false
console.log(Infinity <= Infinity); //true
console.log(Infinity == Infinity); // 规定:true
console.log(Infinity != Infinity); //false
console.log(Infinity === Infinity); //true
console.log(Infinity !== Infinity); //false
非正常情况2
其他数据类型参与比较运算(排除字符串与字符串的比较)
- 其他数据类型也会隐式转换为数字参与比较 "123" → 123 true → 1 false → 0 null → 0 undefined → NaN "" → 0 "abc" → NaN
- null的判断比较特殊(因为在此处认为:null是无限趋近于0): null与0判断时,相等判断为false,不等于也是false, >= 和 <= 判断为true
// null的特殊情况
console.log(0 == undefined); //false
console.log(0 == null); //false
console.log(0 >= null); //true
console.log(0 <= null); //true
console.log(1 > null); //true
- null == undefined
非正常情况3
字符串与字符串比较
- 不会发生隐式转换为数字,而是比较两个字符串的Unicode编码
- 字符编码顺序:从前往后0 ~ 9、A ~ Z、a ~ z ,前面的小于后面的。
- 比较时不关心两个字符串的长度,从第一个字符开始比较,依次往后顺延比较,直到比较出大小,就不再往后比较。
console.log(8 < "12"); //true
console.log("8" < "12"); //false
比较运算符运算顺序
- 之前学习有关数学的部分计算知识在js中不适用
// 3 > 2 是一个表达式,因此会计算出一个值:true 也就转换为:console.log(true > 1); 此时显示为:false
console.log(3 > 2 > 1); //false
逻辑运算符
逻辑运算符常用于布尔类型值之间;当操作数都是布尔值时,返回值也是布尔值。
/* && 逻辑与运算符 且
|| 逻辑或运算符
! 逻辑非运算符
*/
正常情况
布尔类型的值的运算,返回值为布尔值。
console.log(!true); //false
console.log(true && false); // false
非正常情况
其他数据类型的值也可以参与逻辑运算。运算过程中需要将操作数隐式转换为布尔类型的值,参与判断计算,最终运算结果还是原来的某个位置的数据。
- 并不是所有逻辑运算返回结果都是布尔值,其他数据参与得到的就是数据本身。
console.log(null && "12"); //null
隐式转换为布尔值的规律
- 转换为false: NaN、undefined、null、0、""
- 转换为true: 非0 非NaN数字、非空字符串(包含" ")
- 当它们用于非布尔值的时候,返回值就可能是非布尔值。
- (逻辑与a && b)如果a为false,返回a;否则返回b.
- (逻辑或a || b)如果a为true,返回a;否则返回b.
逻辑运算符运算顺序
- 综合运算顺序:非(先计算就近的)、与、或
/* 1. !8 -> false
2. null && undefined -> null
3. null || false -> false
*/
var n = null && undefined || !8;
console.log(n); // false
赋值运算符
/*
赋值运算符符号
= 等于
+= 加等于
-= 减等于
*= 乘等于
/= 除等于
%= 取余等于
++ 递加
-- 递减
*/
一元运算符
- ++和--也叫一元运算符,只有一个操作数
- 以++为例:
- a++: 先参与,后自加
- ++a: 先自加,后参与
- 实际举例
//采用解题两行法
var a = 10,b = 20,c = 30;
// 当前值: 10 21 30 12
var sum = a++ + ++b + c++ + ++a;
// 新值: 11 21 31 12
console.log(sum); // 将第一行值加起来:73
运算优先级
/*
运算优先级:
()
一元运算符:++ -- !
算数运算符:* / % + -
关系运算符: > < >= <=
相等运算符: == != === !===
逻辑运算符:&& ||
赋值运算符:=
*/
- 案例:
var a = 4;
var num = 1 * (2 + 3) && ++a || 5 > 6 && 7 < 8 || !9;
console.log(num); // num = 5;