js的操作符能适应很多类型的值,包括:字符串、数字值、布尔值,甚至是对象类型。本文总结了常用的操作符对不同类型值的操作数的处理规则
一元操作符
递增和递减操作符
符号:++、–
示例:
var age=29;++age;
规则:
-
在应用在一个包含有效数字字符的字符串时,先将其转换为数字值,在执行加减1的操作。
-
在应用于一个不包含有效数字字符的字符串时,将变量的值设置为NaN
-
在应用于布尔值false/true时,先将其转换为0/1再执行加减1的操作。
-
在应用于整数/浮点数值时,执行加减1的操作
-
在应用于对象时,先调用对象的valueOf()以取得一个可供操作的值。然后对该值应用前面的规则。如果结果是NaN,则再调用toString()方法后再应用前面的规则。
一元加和减操作符
符号:+、-
示例:
var num=25;num=+num;
规则:
-
’+’放在数值前面,对数值不会产生任何影响;’-‘放在数值前面,该值会变成负数
-
应用在非数值时,该操作符会像Number()转换函数一样会这个值执行转换。换句话说,布尔值false/true将被转换为0/1,字符串值会被按照一组特殊的规则进行解析,而对象是先调用它们的valueOf()和(或)toString()方法,再转换得到的值,再应用前面的规则
乘性操作符
如果参与乘法计算的某个操作数不是数值,后台会先使用Number()转型函数将其转换为数值。也就是说,空字符串将被当做0,布尔值true将被当做1,null将被当做0。
乘法
符号:*
示例: var result=34*56;
规则:
-
如果操作数都是数值,执行常规的乘法计算,即两个正数或两个负数相乘的结果还是正数,而如果只有一个操作数有符号,那么结果就是负数。如果乘积超过了ECMAScript数值的表示范围1,则返回Infinity或-Infinity
-
如果有一个操作数是NaN,则结果是NaN
-
如果是Infinity与0相乘,则结果是NaN
-
如果是Infinity与非0数值相乘,则结果是Infinity或-Infinity,取决于有符号操作数的符号
-
如果是Infinity与Infinity相乘,则结果是Infinity
-
如果有一个操作数不是数值,则在后台调用Number()将其转换为数值,然后再应用上面的规则
除法
符号:/
示例: var result=66/11;
规则:
-
如果操作数都是数值,执行常规的除法计算,即两个正数或两个负数相除的结果还是正数,而如果只有一个操作数有符号,那么结果就是负数。如果乘积超过了ECMAScript数值的表示范围,则返回Infinity或-Infinity
-
如果有一个操作数是NaN,则结果是NaN
-
如果是0被0除,则结果是NaN
-
如果是Infinity被任何非零数值相除,则结果是Infinity或-Infinity,取决于有符号操作数的符号
-
如果是非零的有限数被0除,则结果是Infinity或-Infinity,取决于有符号操作数的符号
-
如果是Infinity被Infinity除,则结果是NaN
-
如果有一个操作数不是数值,则在后台调用Number()将其转换为数值,然后再应用上面的规则
求模
符号:%
示例: var result=26%5;
规则:
-
如果操作数都是数值,执行常规的除法计算,返回除得的余数
-
如果被除数是无穷大值而除数是有限大的数值,则结果是NaN
-
如果被除数是无穷大值而除数是0,则结果是NaN
-
如果被除数是有限大的数值而除数是无穷大值,则结果是被除数
-
如果是Infinity被Infinity除,则结果是NaN
-
如果被除数是0,则结果是0
-
如果有一个操作数不是数值,则在后台调用Number()将其转换为数值,然后再应用上面的规则
布尔操作符
逻辑非
符号:!
示例: !false
规则:
-
无论操作数的类型是什么,都会返回一个布尔值
-
如果操作数是一个对象,返回false;
-
如果操作数是一个空字符串/非空字符串,返回true/false;
-
如果操作数是0/非0的数值(包含Infinity),返回true/false
-
如果操作数是null、NaN、undefined,返回true
逻辑与
符号:&&
示例: var result=true&&false;
规则:
-
应用于布尔值时,只有两个操作数的结果都为true时才返回true,否则返回false,且如果第一个操作数的结果为false则直接返回false
-
如果第一个操作数是对象,则返回第二个操作数
-
如果第二个操作数是对象,则只有在第一个操作数的求值结果为true时才会返回该对象
-
如果两个操作数都是对象,则返回第二个操作数
-
如果有一个操作数是null,则返回null;
-
如果有一个操作数是NaN,则返回NaN;
-
如果有一个操作数是undefined,则返回undefined
逻辑或
符号:||
示例: var result=true||false;
规则:
-
应用于布尔值时,只有两个操作数的结果都为false时才返回false,否则返回true,且如果第一个操作数的结果为true则直接返回true
-
如果第一个操作数是对象,则返回第一个操作数
-
如果第一个操作数的求值结果为false,则返回第二个操作数
-
如果两个操作数都是对象,则返回第一个操作数
-
如果两个操作数是null,则返回null;
-
如果两个操作数是NaN,则返回NaN;
-
如果两个操作数是undefined,则返回undefined
加性操作符
加法
符号:+
示例: var result=1+2;
规则:
注:Date类型的对象会在二元+运算时优先调用toString()
减法
符号:-
示例: var result=2-1;
规则:
关系操作符
符号:>、<、<=、>=
示例: var result=6>5;
规则:
-
如果是两个操作数都是数值,则执行数值比较
-
如果两个操作数都是字符串,则比较两个字符串对应的字符的编码值,以短的字符串长度为总比较次数,如果true比false多则结果为true
-
如果一个操作数是数值,则将另一个操作数转换为一个数值,然后执行数值比较
-
不能转换为数值的操作数会转化为NaN,而任何与NaN进行比较时,结果返回false
-
如果一个操作数是对象,则调用这个对象的valueOf()方法,用得到的结果按照前面的规则执行比较。如果对象没有valueOf()方法,则调用toString()方法,并用得到的结果根据前面的规则执行比较
-
如果一个操作数是布尔值,则先将其转换为数值,然后再执行比较
相等操作符
相等和不相等
不同类型会先转换类型(强制转型),然后才比较它们的相等性
符号:==、!=
规则:
-
如果有一个操作数是布尔值,则在比较相等性之前先将其转换为数值,false转换为0,而true转换为1
-
如果一个操作数是字符串,另一个操作数是数值,在比较相等性之前先将字符串转换为数值
-
如果一个操作数是对象,另一个操作数不是,则调用对象的valueOf()方法,用得到的基本类型值按照前面的规则进行比较
全等和不全等
符号:===、!==
规则:
-
两个操作数未经转换就相等的情况下返回true,否则为false
-
null和undefined的全等比较返回false