4.8.1 "+"运算符
二元加法运算符“+”可以对两个数字做加法,也可以做字符串连接操作:
如果当2个操作数都是数字或者字符串的时候,无需转换,数字会相加,字符串会拼接。对于其他情况,则要进行一些必要的类型转换,并且运算符的行为依赖于类型转换的结果。加号的转换规则优先考虑字符串连接,如果其中一个操作数是字符串或者转换为字符串的对象,另一个操作数将会转换为字符串,加法将进行字符串的连接操作。如果2个操作数都不是类字符串,那么将进行算术加法运算。
从技术上讲,加法操作符的行为表现。
① 如果其中一个操作数是对象,则对象会遵循对象到原始值的转换规则转换为原始类值:日期对象是通过 toString() 方法执行转换,其他对象则通过 valueof() 方法执行转换(如果 valueof() 方法返回一个原始值的话)。由于多数对象都不具备可用的 valueof() 方法,因此它们会通过 tostring() 方法来执行转换。
② 在进行了对象到原始值的转换后,如果其中一个操作数是字符串的话,另一个操作数也会转换为字符串,然后进行字符串连接。
③ 否则,两个操作数都将转换为数字(或者NaN),然后进行加法操作。
1+2 // 3 加法 “1”+“2” // 12 字符串拼接 “1”+2 // 12 数字转换为字符串,然后拼接 1+{} // 1[object object] 对象转换为字符串后进行字符串连接 true+true // 2 布尔值转换为数字后做加法 2+null // 2 null 转换为0后做加法 2+undefined // NaN undefined 转换为NaN 后做加法
当加号运算符和字符串和数字一起使用时,需要考虑加法的结合性对运算顺序的影响。也就是说,运算结果是依赖于运算符的运算顺序的,比如:
1+2+“blind mice” // "3 blind mice" 1+(2+"blind mice") // "12 blind mice"
4.8.2 一元算术运算符
一元运算符作用于一个单独的操作数,并产生一个新值。在JS 中,一元运算符具有很高优先级,而且都是右结合。
例如:一元加(+)、一元减(-)、递增(++)、递减(--)
4.8.3 位运算符
按位与(&)
按位或( | )
按位异或(^):位运算符“|”对它的整型操作数逐位执行布尔异或操作,异或是指第一个操作数为 true 或第二个操作数为 true。但两者不能同时为 true。如果两个操作数中只要一个相应位为 1(不能同时为1),那么结果中的这一位就是1 。例如:oxFoFo ^ oxFoFo = oxoFFo