为了账号安全,请及时绑定邮箱和手机立即绑定

一些怪癖的类型转换

一些怪癖的类型转换

白衣染霜花 2019-01-30 16:14:12
收集了一些比较怪的类型转换,我不懂原因,大家讨论讨论这是为什么?[] == ![]         // 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
查看完整描述

1 回答

?
慕哥6287543

TA贡献1831条经验 获得超10个赞

1. 字符串与数字之间的相等比较,此时 字符串会被强制转换为数字
2. 其他类型和布尔值类型之间的相等比较, 布尔值会被强制转换为数字, true转为1,false 转为0
3. null 和undefined之间的相等比较, null == undefined 返回true
4. 对象和非对象之间的相等比较, 对象需要进行ToPrimitive抽象操作(如toString(), valueOf())

根据上面的四条规律,来理解下面几题:

  1. [] == ![] 相当于 [] == false 相当于 '' == false 相等于 '' == 0 相当于 0 == 0 因此结果为true

  2. '1' == true 相当于 '1' == 1 相当于 1==1 因此结果为true

  3. '2' == true 相当于 '2' == 1 相当于 2 ==1 因此结果为false

  4. '3' == true 相当于 '3' == 1 相当于 3 ==1 因此结果为false

根据规范 a<=b 会被当做 b < a,然后将结果反转,因此

  1. null >= 0 可以理解为 !(null < 0)。 因为 null < 0 为false, 所以 null >=0 结果为true

使用+操作符时,如果其中一个操作符是对象,那么会先调用valueOf()方法,如果该方法返回基本类型值,就不再调用toString()方法。否则就调用toString()方法(有个例外,Date 的实例对象总是先调用toString,再调用valueOf)。
数组的valueOf()得不到基本类型值,所以数组会调用toString()方法。

  1. {} + 1 的前面的{}是个空的代码块, 如果加上换车键 或许更好理解了。{} 回车 +1。 +1结果返回1了。

  2. {var a = 10} + 1 道理跟上面一下,前面的{}是个代码块,只是后面没加回车键。+1结果返回1.

  3. {} + {} 是两个空对象相加, 分为转为字符串({}).toString(),再相加。结果为"object Object"

  4. +[] 相当于 Number([]), 结果为0

  5. {} + [] 这里{}依旧是空代码块,因此返回+[]的结果,也就是0

  6. [1,2]+ [3,4] [1,2]转为字符串'1,2' [3,4]转为字符串'3,4' , 因此结果为 "1,23,4"

  7. +[2] 相当于 +'2' 相当于 Number('2')因此,结果为2

  8. [2]+1 相当于 '2' +1 因此,结果为'21'

  9. [2] + (-1) 相当于 '2'+(-1) 因此结果为'2-1'


查看完整回答
反对 回复 2019-01-30
  • 1 回答
  • 0 关注
  • 520 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信