==运算符
==比较符的如果两端数据类型不一致时会先进行隐式转换,然后再比较值是否相等,转换规则如下:
1.string与number比较时,先将string转成number,然后比较大小
2=="2" //true
2.布尔类型与其它类型比较时,先将布尔类型转成数值,然后再比较
false=="2" //false
第一步:0=="2";
第二步:0==2(字符串和其它类型比较时先将字符串转成数字类型)
3.string、number和object类型比较时,先把对象转换成基础类型的值再比较。对象转换成基础类型,利用它的toString
或者valueOf
方法。
[] == 0//true
第一步:左侧是一个数组,调用valueOf后得到的类型还是数组,数组不是基础类型,然后调用toString()方法,得到一个空字符串"",表达式变为""==0
第二步: 字符串跟数字比较时,把字符串转换为数字,表达式变为0==0
注:ECMAScript 有 5 种原始类型(primitive type),即 Undefined、Null、Boolean、Number 和 String。
各类型调用valueOf或toString后的结果请点击
+运算符
A+B时会执行以下过程:
第一步:A和B分别转换成原始值,记为A1和B1
第二步:如果A1或B1中有一个是字符串,如果A1和B1中有一个值为string,则将A1、B1都转换为string(执行ToString),其值记为A2、B2,将A2 B2连接后就是A+B的结果
第三步:如果不满足条件2,则将A1和B1都转换为number(执行ToNumber),其值记为A3、B3,将A3 B3相加即为A+B的结果
原始值转为Number的过程如下,方了方便叙述,原始值统一用obj代替:
- 如果obj为原始值,直接返回;
- 否则调用 obj.valueOf(),如果执行结果是原始值,返回之;
- 否则调用obj.toString(),如果执行结果是原始值,返回之;
- 否则抛异常。
了解了上述的转换机制后,下面的例子就很简单了
true + 1 // 1,布尔型转化为了数字 [] + 1 // ‘1‘,空数组转化为了字符串 {} + 1 // 1,空对象转化为了数字 var now = new Date() typeof (now + 1) // ‘string‘,日期对象转化为了字符串