==隐式类型转换规则 笔记

  1. x == y

如果x是字符串类型 则执行 Number(x) == y

如果y是字符串类型 则执行 x==Number(y)

如果双方有字符串 会先把字符串隐式转换成数字类型

例如

"123" == 22 false 会把字符串"123"转换成123 再用数字123和数字22比较

"abc" == 22 false Number("abc") 返回NaN NaN与22比较为false

  1. x == y

如果x是布尔值 则执行 Number(x) == y

如果y是布尔值 则执行x == Number(y)

如果双方有一个是布尔值 则会先把布尔值转换成数字类型

例如:

false == 22 结果是false 因为会先执行Number(false) 为0 0 == 22

false == "22" 结果还是false 因为会先执行 Number(false) 结果为0 在执行Number("22") 结果是22 最后比较 0==22 结果是false

  1. 如果x == y

如果x是字符串或数字 y是对象类型的(对象/函数/数组)则返回x == toPrimitive(y) 的结果

如果x是对象类型, y是字符串或数字 则返回 toPrimitive(x) == y的结果

toPrimitive是将值转换成基本类型值得抽象操作,它首先会检查该值是否有valueOf()方法,如果有并且返回基本类型值,就使用该值进行强制类型转换,如果没有就使用toString()得返回值(如果存在)来进行强制类型转换。 如果 valueOf()和toString() 都不返回基本类型值 则产生TypeError错误

注 x或者y 没有写布尔类型 是因为第二条规则 如果一方有布尔值 布尔值会被先转换成数字

例如

var a = 42

var b = [42]

a== b // true

  1. null和undefined之间得比较

规则:x == y

如果x为null y是undefined 则x == y 为true

如果x为undefined ,y是null 则x == y 为true

在 == 中null和undefined相等 (他们也与其自身相等) 除此之外其他值都不和他们两个相等

null == undefined // true

null == null // true

undefined == undefined // true

0 == null // false

fasle== undefined //false

"" ==null // false

  1. 比较少见得情况

1.

Number.prototype.valueOf = function(){

return 3

}

new Number(2) == 3 // true 因为Number(2)涉及ToPrimitive强制类型转换,因此 会调用

valueOf()

2.

"0" == false //true

false == 0 //true

false == " " //true

false == [] //true

"" == 0 //true

"" == [] //true

0 == [] //true

3.

[]==![] //true 首先执行![] 执行结果是false 然后再执行 [] == false

[]=={} //false []调用valueOf返回[] ,[]不是基本类型所以调用[]的toString() 返回 “”

{}调用valueOf 返回 {} ,{}不是基本类型所以调用{}的toString()方法返回 [ Object Object ]

所以执行"" == [Object Object] 执行结果是false

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值