收集了一些比较怪的类型转换,我不懂原因,大家讨论讨论这是为什么?
[] == ![] // true
'1' == true // true
'2' == true // false
'3' == true // false
null >= 0 // true
{} + 1 // 1
{var a = 10} + 1 // 1
{} + {} // "[object Object][object Object]"
+[] // 0
{} + [] // 0
[1,2]+ [3,4] // "1,23,4"
+[2] // 2
[2]+1 //"21"
[2] + (-1) // "2-1"
null特殊情况
+null // 0
null == 0 // false
null > 0 // false
null < 0 // false
!!null // false
null == false // false
null == true // false
使用 == 进行比较,如果比较的类型不同,可以分为四种情况
1. 字符串与数字之间的相等比较,此时 字符串会被强制转换为数字
2. 其他类型和布尔值类型之间的相等比较, 布尔值会被强制转换为数字, true转为1,false 转为0
3. null 和undefined之间的相等比较, null == undefined 返回true
4. 对象和非对象之间的相等比较, 对象需要进行ToPrimitive抽象操作(如toString(), valueOf())
根据上面的四条规律,来理解下面几题:
根据规范 a<=b 会被当做 b < a,然后将结果反转,因此
使用+操作符时,如果其中一个操作符是对象,那么会先调用valueOf()方法,如果该方法返回基本类型值,就不再调用toString()方法。否则就调用toString()方法(有个例外,Date 的实例对象总是先调用toString,再调用valueOf)。
数组的valueOf()得不到基本类型值,所以数组会调用toString()方法。