比较运算
比较运算符可以简单分为两类:
- 严格比较
- 非严格比较
严格比较
===
和 !==
都是严格比较,!==
是 ===
的结果取反,===
规则如下:
true
- 都为
null
,严格相等 - 都为
undefined
,严格相等 - 都为
true
或都为false
,严格相等 - 都是
number
类型并且具有相同的值,严格相等 - 都是
string
类型并且具有相同的值,严格相等 - 都引用相同的对象或函数,严格相等
- 都为
false
- 任意操作数为
NaN
,不是严格相等 - 类型不同,不是严格相等
- 所有其他情况下操作数都不是严格相等的
- 任意操作数为
非严格比较
==
, !=
是非严格比较,==
比较步骤如下:
- 类型相同时,使用严格比较验证它们是否严格相等
- 类型不同时
- 如果一个操作数为
null
且另一个为undefined
,则它们相等 - 如果一个值是数字,另一个是其它类型,先将其它类型转为数字,然后比较
- 如果一个操作数是布尔值,则将两数转换成数字,然后比较
- 如果一个操作数是一个对象,而另一个操作数是一个数字或字符串,则使用对象转换规则将该对象转换为另一个操作数的类型,然后比较
- 在以上的其他情况下,操作数都不相等
- 如果一个操作数为
比较运算符
>=
, <=
, >
, <
都是比较运算符
- 如果两数都是字符串,按照字典比较
- 其余的按照非严格比较
加减乘除
在 +
, -
, *
, /
中,+
比较特殊
在 +
运算时,途中如果遇到字符串,则转换成字符串然后拼接,例如:
1 + 23 + '56' + 7; // '24567'
过程如下:
1 + 23 = 24
24 + '56' = '2456'
'2456' + 7 = '24567'
其余运算符会将所有值转为数字然后计算
对象转换规则
在一个对象上:
- 如果方法
valueOf()
存在,则调用它;如果valueOf()
返回一个原始值,JS 将这个值转换为字符串(如果本身不是字符串的话),并返回这个字符串结果 - 如果方法
toString()
存在,则调用它;如果toString()
返回一个原始值,JS 将这个值转换为字符串(如果本身不是字符串的话),并返回这个字符串结果。需要注意,原始值到字符串的转换 - 否则,JS 无法从
toString()
或valueOf()
获得一个原始值,它将抛出一个 TypeError: Cannot convert object to primitive value 无法转换对象为原始值的错误