1. 减号、乘号、除号、取模...
这些操作符会尝试将他们的操作数转换为数字(使用Number()
),如果操作数没法转换为数字的话,他们的结果就是NaN
。
2. 加号(+)
当没有特别指定的时候参考(1),但有如下几种例外情况:
- 字符串 + 字符串:进行字符串拼接操作。
- 字符串 + 其他:将其他转换为字符串,并进行拼接操作。
加法运算会触发三种类型转换:将值转换为原始值,转换为数字,转换为字符串。
1 + '1' // '11'
2 * '2' // 4
[1, 2] + [2, 1] // '1,22,1'
// [1, 2].toString() -> '1,2'
// [2, 1].toString() -> '2,1'
// '1,2' + '2,1' = '1,22,1'
3. ==、!=
在条件判断运算 == 中的转换规则是这样的:
- 如果比较的两者中有布尔值(Boolean),会把 Boolean 先转换为对应的 Number,即 0 和 1,然后进行比较。
- 如果比较的双方中有一方为 Number,一方为 String时,会把 String 通过 Number() 方法转换为数字,然后进行比较。
- 如果比较的双方中有一方为 Boolean,一方为 String时,会将双方转换为数字,然后再进行比较。
- 如果比较的双方中有一方为 Number,一方为Object时,则会调用 valueOf 方法将Object转换为数字,然后进行比较。对象在转换基本类型时,首先会调用 valueOf 然后调用 toString。并且这两个方法你是可以重写的。
这两个运算符在大部分上面都是与(1)相同的,不同的是:
- 字符串 op 字符串:不会进行类型转换,直接比较。
- 对象 op 对象:引用都指向同一个对象才为true。
在条件判断时,除了 undefined, null, false, NaN, '' , 0, -0,其他所有值都转为 true,包括所有对象
建议在所有使用条件判断的时候都使用全等运算符 ===
来进行条件判断。全等运算符会先进行数据类型判断,并且不会发生隐式类型转换。
4. 大于、小于、大于等于、小于等于
同(一),但是对于两个操作数均是字符串的时候&无法转换时的返回值会有不同。
当两个操作数均是字符串的时候,它会执行大家熟悉的字符串比较,即从左到右依次比较每一个字符的ASCII码,若出现符合操作符的情况,则返回true,否则返回false。
无法将操作数转换为数字的情况下总是返回false。