1.一元操作符
只能操作一个值的操作符叫做一元操作符。
1.递增和递减操作符
前置型:位于要操作的变量之前。由于前置递增和递减操作与执行语句的优先级相等,因此整个语句都会从左至右被求值。所以,执行前置递增和递减操作时,变量的值都是在语句被求值以前改变的。
后置型:执行前置递增和递减操作时,变量的值都是在语句被求值以后改变的。
所有这4个操作符对任何值都适用,也就是他们不仅适用于整数,还可以用于字符串,布尔值,浮点数值,和对象。在应用于不同的值时,递减和递增操作符遵循以下规则:
- 在应用于一个包含有效数字字符的字符串时,先将其转换为数字值,再执行操作。
- 在应用于一个不包含有效数字字符的字符串时,将其变为NaN,再进行操作。
- 在应用于一个true或者false的布尔值时,将其转换为0或1,再执行操作。
- 浮点数等同于普通数值。
- 在应用于对象时,先调用对象的valueOf()方法以取得一个可供操作的值。如果结果值为NaN,则再调用toString()方法。
2.一元加和减操作符
一元加操作符以一个(+)表示,放在数值前面,对数值不会产生任何影响。
不过,在对非数值应用一元加操作符时,该操作符会像Number()转型函数一样对这个值执行转换。
一元减操作符应用于数值时,该值会变成负数。
在应用于非数值时,等同于一元加。
2.位运算符
位操作符用于在最基本的层次上,即按内存中表示数值的位来操作数值。如果对非数值应用位操作符,会先使用Number()函数将该值转换为一个数值,然后再进行位操作。
- 按位非(~)
- 按位与(&)
- 按位或(|)
- 按位异或(^)
- 左移(<<)
- 有符号的右移(>>)
- 无符号右移(>>>)
3.布尔操作符
1.逻辑非(!)
可以应用于任何值。无论这个值是什么数据类型,这个操作符都会返回一个布尔值。逻辑非操作符首先会将它的操作符转换为一个布尔值,然后对其求反。如果使用两次逻辑非,就相当于Boolean()函数。
2.逻辑与(&&)
逻辑与操作可以应用于任何类型的操作数,而不仅仅是布尔值。在有一个操作数不是布尔值的情况下,它遵循下列规则:
- 如果第一个操作数是对象,则返回第二个操作数。
- 如果第二个操作数是对象,则只有第一个为true的时候返回。
- 如果第一个操作符为true,返回第二个操作符,否则,返回第一个操作符。
3.逻辑或(||)
与逻辑与操作相似,如果有一个操作数不是布尔值,它也不一定返回布尔值,此时,它遵循以下规则:
- 如果第一个操作符为true,就返回第一个操作符,否则,返回第二个操作符。
4.乘性操作符
1.乘法(*)
乘法操作符用于计算两个数值的乘积。在处理特殊值的情况下,乘法操作符遵循下列特殊的规则:
- 如果操作符都是数字,则执行常规运算。
- NaN乘以任何数都是NaN
- Infinity与0相乘,则结果是NaN;
- Infinity与f非0数值相乘,则结果是Infinity或-Infinity,取决于有符号操作数的符号;
- Infinity与Infinity相乘,则结果是Infinity;
- 如果有一个操作符不是数值,则在后台调用Number()将其转换为数值,然后再应用上面的规则;
2.除法(/)
- 如果操作符都是数字,则执行常规运算。
- 如果有一个操作数是NaN,则结果是NaN;
- 0除以0,则结果是NaN;其他数除以0,为Infinity或-Infinity.
- 如果除数是Infinity,则结果是Infinity或-Infinity;
- 如果有一个操作符不是数值,则在后台调用Number()将其转换为数值,然后再应用上面的规则;
3.求模(%)
求模即取余
- 如果操作符都是数字,则执行常规运算。
- 如果被除数是无穷大值而除数是有限大的数值,则结果是NaN;
- 除数为0,则结果是NaN;
- Infinity与Infinity相除,则结果是NaN;
- 如果被除数是有限大的数值而除数是无穷大的数值,则结果就是被除数;
- 被除数是0,则结果是0;
- 如果有一个操作符不是数值,则在后台调用Number()将其转换为数值,然后再应用上面的规则;
5.加性操作符
1.加法
字符串是特殊情况
- 如果有一个操作数是NaN,则结果是NaN;
- Infinity加Infinity,则结果是Infinity;
- -Infinity加-Infinity,则结果是-Infinity;
- Infinity加-Infinity,则结果是NaN;
- +0加-0,则结果是+0;
- 如果有一个操作数不是数字,也不是字符串,则调用Number()函数转换为数字;
如果有一个是字符串
- 直接将两个数拼接起来;
2.减法
- 如果有一个操作数是NaN,则结果是NaN;
- Infinity减Infinity,则结果是NaN;
- -Infinity减-Infinity,则结果是NaN;
- Infinity减-Infinity,则结果是Infinity;
- +0减-0,则结果是+0;
- 如果有一个操作数不是数字,也不是字符串,则调用Number()函数转换为数字;
6.关系操作符
小于(<),大于(>),小于等于(<=),和大于等于(>=)这几个值都用于对两个值进行比较,返回布尔值。
- 如果两个操作数都是数值,则进行数值比较;
- 如果两个操作数都是字符串,则比较两个字符串对应的字符串编码;
- 如果一个操作数是数字,则将另一个操作数转换为数值,然后执行数值比较;
- 如果一个操作数是对象,则调用这个对象的valueOf()方法,用得到的结果按照前面的规则执行比较。如果对象没有valueOf()方法,则调用toString()方法,并用得到的结果根据前面的规则执行比较;
- 如果一个操作数是布尔值,则先将其转换为数值,然后执行比较;
7.相等操作符
相等和不相等:先转换再比较。==和!=
- 如果有一个操作数是布尔值,则在比较相等性之前先将其转换为数值,false为0,true为1;
- 如果有一个操作数是字符串,另一个操作数是数值,则在比较相等性之前先将字符串转换为数值。
- 如果一个操作数是对象,另一个操作数不是,则调用对象的valueOf()方法,用得到的基本类型值按照前面的规则进行比较;
这两个操作符在进行比较时要遵循下列规则:
- null和undefined是相等的;
- 要比较相等性之前,不能将null和undefined转换为其他任何值;
- NaN不等于NaN;
- 如果两个操作数都是对象,则比较它们是不是同一个对象;
全等和不全等
除了在比较之前不转换操作数之外,全等和不全等操作符与相等和不相等操作符没什么区别。
8.条件操作符
var max = (num1 > num2) ? num1 : num2;
9.赋值运算符
- 乘/赋值(*=);
- 除/赋值(/=);
- 模/赋值(+=);
- 加/赋值(+=);
- 减/赋值(-=);
- 左移/赋值(<<=);
- 有符号右移/赋值(>>=);
- 无符号右移/赋值(>>>=);
10.逗号操作符
使用逗号操作符可以在一条语句中执行多个操作。