算数运算符
- + -* / % ()
- %:取余,取模。a / b = c 余d,就说a % b = d。
- 运算顺序:先算乘除取余、再算加减,有小括号先算小括号。
正常情况下运算(按照数学计算方法)
- 数字与数字之间的运算。
非正常情况
Number类型参与运算
- 有特殊值字面量参与的运算。
- NaN参与的运算:得到的结果都是NaN
- Infinity参与的运算,视情况而定
console.log(Infinity + 5); //Infinity
console.log(Infinity - 5); //Infinity
console.log(Infinity * 5); //Infinity
console.log(Infinity / 5); //Infinity
console.log(Infinity % 5); //不确定返回NaN
其他类型的数据参与数学运算
- 有字符串参与的+ 运算:+ 号变为连字符将前后连接成整体字符串。
- 隐式转换:除了字符串参与的+ 运算,其他情况下,所有其他数据类型参与数学运算时,计算机暗中将其他数据类型先自动转换成数字类型,再参与运算,这个过程中不需要使用parseInt()、Number() 等方法,过程是暗中进行,这就是一个隐式转换的过程。
console.log(1 + "2"); //12
console.log(1 - "2"); //-1
console.log(1 * "2"); //2
console.log(1 / "2");//0.5
console.log(1 % "2");//1
console.log(1 - "");//1
console.log(1 - " ");//1
console.log(1 - "12abc");//NaN
隐式转换
其他的数据类型会隐式转换为数字类型:
- 对应数字:纯数字字符串会转为对应的数字”123”→123
- 转换为1:true
- 转换为0:false、null、“”空字符串、空白字符串
- 转换为NaN:undefined、非空非纯数字字符串
比较运算符(关系运算符-返回值为布尔类型(true/flase))
正常情况下运算(按照数学比较方法进行比较)
- 数字与数字比较
非正常情况下
特殊值参与比较运算
- NaN参与:不等于和不全等于结果是true,其他的都得到false。
- Infinity参与的运算,视情况而定
其他类型的数据参与比较运算
- 其他数据类型也会隐式转换为数字参与比较。
- null 的判断比较特殊:null 与0 判断时,相等判断为false,>= 和<= 判断为true
- null == undefined
字符串与字符串比较
- 不会发生隐式转换为数字,而是比较两个字符串的Unicode 编码顺序。
- 字符编码顺序:从前往后0-9,A-Z,a-z,前面的小于后面的。
- 比较时,不关心两个字符串的长度,从第一个字符开始比较,依次往后顺延比较,直到比较出大小,就不再往后比较。
比较运算符运算顺序
从前往后比较,前面的结果与后面的进行比较。
逻辑运算符(返回bool类型)
正常情况下运算
- 布尔类型的值参与运算,返回值为布尔值。
非正常情况下运算(隐式转换为bool)
- 转为false:NaN、0、“”空字符串、null、undefined
- 转为true:非0 非NaN、数字、非空字符串
- 当它们用于非布尔值的时候,返回值就可能是非布尔值。其实这种运算非常简单,就两句话(不管b的类型和值,直接返回b。比如b为数字5,返回数字5):
- (逻辑与a&&b) 如果a能被转换为false,那么返回a;否则,返回b。
- (逻辑或a ||b ) 如果a能被转换为true,那么返回a;否则,返回b。
逻辑运算符运算顺序
- 同种运算符从前往后运算。
- 综合运算顺序:非、与、或。
赋值运算符
即定义变量,给变量值。例如
var a=2;//a的值为2
a +=1;// a的值为3
其他运算符与+=一样
一元运算符
- ++ 和–也叫一元运算符,只有一个操作数。
- ++ 或–符号可以写在变量前和变量后面,位置不同可能导致程序运行结果不同。
- a++: ++ 符号在变量之后,a++ 在参与程序过程中使用的原始没有加1 的值,使用完后第二次用a 变量时,a 用的就是加1 后的新值。先参与,后自加。
- ++a:++ 符号在变量之前,++a 在参与过程中整体就使用a 加1 之后的新值,使用完后第二次用a 变量时,a 用的也是加1 的新值。先自加,后参与。
var a = 1, b = 2;
var c = a++ + b; //a以1参与运算
var c = ++a + b; //a以2参与运算
var c = a++ + b + ++a; //第一个a以1参与运算,第二个a以3参与运算
运算优先级(综合运算顺序)
// () → 一元 → 算术 → 比较 → 逻辑 → 赋值
var a = 4;
var num = 1 * (2 + 3) && ++a || 5 > 6 && 7 < 8 || !9;
// num = 1 * 5 && ++a || 5 > 6 && 7 < 8 || !9
// num = 1 * 5 && 5 || 5 > 6 && 7 < 8 || false
// num = 5 && 5 || 5 > 6 && 7 < 8 || false
// num = 5 && 5 || false && true || false
// num = 5 || false || false
// num = 5
console.log(num);
笔记输出来源:拉勾前端训练营