一些怪癖的类型转换

收集了一些比较怪的类型转换,我不懂原因,大家讨论讨论这是为什么?

[] == ![]         // true'1' == true       // true'2' == true       // false'3' == true       // falsenull >= 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        // 0null == 0    // falsenull > 0     // falsenull < 0     // false!!null         // falsenull == false  // falsenull == true   // false


白衣染霜花
浏览 521回答 1
1回答

慕哥6287543

1. 字符串与数字之间的相等比较,此时 字符串会被强制转换为数字2. 其他类型和布尔值类型之间的相等比较, 布尔值会被强制转换为数字, true转为1,false 转为03. null 和undefined之间的相等比较, null == undefined 返回true4. 对象和非对象之间的相等比较, 对象需要进行ToPrimitive抽象操作(如toString(), valueOf())根据上面的四条规律,来理解下面几题:[] == ![] 相当于 [] == false 相当于 '' == false 相等于 '' == 0 相当于 0 == 0 因此结果为true'1' == true 相当于 '1' == 1 相当于 1==1 因此结果为true'2' == true 相当于 '2' == 1 相当于 2 ==1 因此结果为false'3' == true 相当于 '3' == 1 相当于 3 ==1 因此结果为false根据规范 a<=b 会被当做 b < a,然后将结果反转,因此null >= 0 可以理解为 !(null < 0)。 因为 null < 0 为false, 所以 null >=0 结果为true使用+操作符时,如果其中一个操作符是对象,那么会先调用valueOf()方法,如果该方法返回基本类型值,就不再调用toString()方法。否则就调用toString()方法(有个例外,Date 的实例对象总是先调用toString,再调用valueOf)。数组的valueOf()得不到基本类型值,所以数组会调用toString()方法。{} + 1 的前面的{}是个空的代码块, 如果加上换车键 或许更好理解了。{} 回车 +1。 +1结果返回1了。{var a = 10} + 1 道理跟上面一下,前面的{}是个代码块,只是后面没加回车键。+1结果返回1.{} + {} 是两个空对象相加, 分为转为字符串({}).toString(),再相加。结果为"object Object"+[] 相当于 Number([]), 结果为0{} + [] 这里{}依旧是空代码块,因此返回+[]的结果,也就是0[1,2]+ [3,4] [1,2]转为字符串'1,2' [3,4]转为字符串'3,4' , 因此结果为 "1,23,4"+[2] 相当于 +'2' 相当于 Number('2')因此,结果为2[2]+1 相当于 '2' +1 因此,结果为'21'[2] + (-1) 相当于 '2'+(-1) 因此结果为'2-1'
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Html5