1 - 运算符(操作符)
1.1 运算符的分类
运算符(operator)也被称为操作符,是用于实现赋值、比较和执行算数运算等功能的符号。
JavaScript中常用的运算符有:
- 算数运算符
- 递增和递减运算符
- 比较运算符
- 逻辑运算符
- 赋值运算符
1.2 算数运算符
- 算术运算符概述
概念:算术运算使用的符号,用于执行两个变量或值的算术运算。
浮点数的精度问题
浮点数值的最高精度是 17 位小数,但在进行算术计算时其精确度远远不如整数。
所以:不要直接判断两个浮点数是否相等 !var result = 0.1 + 0.2; // 结果不是 0.3,而是:0.30000000000000004console.log(0.07 * 100); // 结果不是 7, 而是:7.000000000000001
表达式和返回值
表达式:是由数字、运算符、变量等以能求得数值的有意义排列方法所得的组合
简单理解:是由数字、运算符、变量等组成的式子
表达式最终都会有一个结果,返回给开发者,称为返回值
1.3 递增和递减运算符
- 递增和递减运算符概述
如果需要反复给数字变量添加或减去1,可以使用递增(++)和递减( — )运算符来完成。
在 JavaScript 中,递增(++)和递减( — )既可以放在变量前面,也可以放在变量后面。放在变量前面时,我们可以称为前置递增(递减)运算符,放在变量后面时,我们可以称为后置递增(递减)运算符。
注意:递增和递减运算符必须和变量配合使用。 - 递增运算符
- 前置递增运算符
++num 前置递增,就是自加1,类似于 num = num + 1,但是 ++num 写起来更简单。
使用口诀:先自加,后返回值
- 前置递增运算符
var num = 10;alert(++num + 10); // 21
- 后置递增运算符
num++ 后置递增,就是自加1,类似于 num = num + 1 ,但是 num++ 写起来更简单。
使用口诀:先返回原值,后自加
var num = 10;alert(10 + num++); // 20
1.4 比较运算符
- 比较运算符概述
概念:比较运算符(关系运算符)是两个数据进行比较时所使用的运算符,比较运算后,会返回一个布尔值(true / false)作为比较运算的结果。
- 等号比较
console.log(18 == '18');console.log(18 === '18');
1.5 逻辑运算符
- 逻辑运算符概述
概念:逻辑运算符是用来进行布尔值运算的运算符,其返回值也是布尔值。后面开发中经常用于多个条件的判断
- 逻辑与&&
两边都是 true才返回 true,否则返回 false

- 逻辑或 ||
两边都是 true才返回 true,否则返回 false

逻辑非 !
逻辑非(!)也叫作取反符,用来取一个布尔值相反的值,如 true 的相反值是 falsevar isOk = !true;console.log(isOk); // false
短路运算(逻辑中断)
短路运算的原理:当有多个表达式(值)时,左边的表达式值可以确定结果时,就不再继续运算右边的表达式的值;- 逻辑与
语法: 表达式1 && 表达式2
``` 如果第一个表达式的值为真,则返回表达式2
如果第一个表达式的值为假,则返回表达式1
```javascriptconsole.log( 123 && 456 ); // 456console.log( 0 && 456 ); // 0console.log( 123 && 456&& 789 ); // 789
逻辑或
语法: 表达式1 || 表达式2
```如果第一个表达式的值为真,则返回表达式1
如果第一个表达式的值为假,则返回表达式2
```javascriptconsole.log( 123 || 456 ); // 123console.log( 0 || 456 ); // 456console.log( 123 || 456 || 789 ); // 123
- 逻辑与
1.6 赋值运算符
概念:用来把数据赋值给变量的运算符。

var age = 10;age += 5; // 相当于 age = age + 5;age -= 5; // 相当于 age = age - 5;age *= 10; // 相当于 age = age * 10;
1.7 关系运算符
- 返回一个布尔值(true或者false);
- 规则:
- 使用非数值时,也要进行数据转换;
- 两个操作数都是数值,则执行常规数值比较;
- 两个操作数都是字符串,则比较两个字符串对应的字符编码值;
- 大写字母的字符编码小于小写字母的字符编码(A=65,a=97);
- 数字字符串(比较的是字符编码),”23” < “3”;//true
- 一个数是数值,将另一个操作数转换成数值,然后进行比较;
- 数字和字符串比较,会把字符串转换为数值,例如: “23” < 3;//false;
- 对象调用valueOf()方法或者toString()方法得到结果进行比较;
- 一个数是布尔值,则将其转换为数值再进行比较;
- 任何数与NaN比较,都会返回false;
特殊情况:
要比较相等性之前,不能将null和undefined转换成其他任何值.
- undefined和null与其他数在进行相等判断时不进行类型转换;
console.log(null == 0);//falseconsole.log(null == undefined);//true
- undefined和null与其他数在进行相等判断时不进行类型转换;
=的结果可以根据<的结果推出(undefined除外 因为会转化为NaN;同样NaN除外);
- 而==的结果与>=没有任何关系,即>=的结果不是>和结果的累和;
null>0 //null转化为number,为0,所以0>0结果为false.null>=0 //null转化为number,为0>=0,所以结果为true.null==0// null在做相等判断时,不进行转型,所以null和0为不同类型数据,结果为false。
1.8 相等运算符
分类
- 相等和不相等: 先转换再比较;
- 全等和不全等: 仅比较而不比较;
- 1.8.1相等和不相等(==,!=)先转换(强制转型)再比较相等性;
- 有一个是布尔值,将其转换成数值(0和1);
- 一个是字符串,一个是数值,将字符串转为数值;
- 只有一个对象时,调用valueOf()方法得到值,再利用前面规则进行比较;
- NaN相等性操作都返回false,不等操作都返回True;
- 1.8.2全等与不全等(===,!==)
- 比较数值与类型,缺一不可;
- 推荐使用全等与不全等操作符;
1.8.3相等运算符的优先级与结合性
概念
- 使用逗号操作符可以在一条语句中执行多个语句;
- 用于声明多个变量;
- 用于赋值,总会返回表达式中的最后一项;
let num = (1,2,3,4,5,6,0);console.log(num);//0
优先级和结合性
变量名 = 条件表达式 ? 值1 : 值2;
let num1 = 5,num2 = 6;let max = (num1 > num2) ? num1 : num2;console.log(max);
1.11 位运算符
概念:
- 按内存中表示数值的位来操作数值,数值按IEEE-754 64位格式存储;
- 将64位的值转换成32位的整数,然后执行操作,最后将结果转回64位;
- 有符号整数:
- 31位用于表示整数的值;
- 第32位(最高位)表示数值的符号(0表示整数,1表示负数);
- 负数以二进制补码存储:
- 求该数正值的二进制:
- 求二进制反码;
- 二进制反码加1;
- 无符号整数:
- 前32位用于表示整数的值;
- 对非数值进行位操作,会先使用Number()转换为数值,再进行位操作;
- 1.10.1按位非(~)
- 返回数值的反码;
- 操作数的负值减1;
- 1.10.2按位与(&):
- 两个数值的二进制数值一一对应,两位数都是1才返回1;
- 1.10.3按位或(|)
- 两个数值的二进制数值一一对应,两位数都是0才返回0,有1返回1;
- 1.10.4按位异或(^)
- 两个数值的二进制数值一一对应,两位数都是0或者1才返回0,不同就返回1;
- 1.10.5左移(<<)与右移(>>)

- 一元运算符里面的逻辑非优先级很高
- 逻辑与比逻辑或优先级高
