javascript 中“==”带来的隐式类型转换规则

javascript 中“==”带来的隐式类型转换规则

一 字符串、数字和布尔值之间的转换规则(抽象操作)

  1. ToPrimitive
    抽象操作ToPrimitive会检查该值是否有valueOf()方法,如果有且返回基本类型值,就使用该值进行强制类型转换。如果没有就使用toString()方法的返回值(如果存在)来进行强制类型转换。
  2. ToString 非字符串到字符串的强制转换
    null =》 “null”
    undefined =》 “undefined”
    true => “true”
    Array =》join(“,”)
    对普通对象来说,除非自行定义,否则toString()返回内部属性[[Class]]的值,如 [object Object]
  3. ToNumber
    true =》 1
    undefined =》 NaN
    null =》 0
    “” => +0
    对象
    (1) 令primValue为 ToPrimitive(输入参数, 暗示数值类型)。
    (2) 返回 ToNumber(primValue)。
    (3) 如果valueOf()和toString()均不返回基本类型值,会产生TypeError错误
  4. ToBoolean 会被转换为假值的值

    1. 0,+0,-0,NaN

    2. “”

    3. undefined

    4. null

    5. false

    可以认为,除以上假值列表以外的值,都将被转化为真值

二 ==中的隐式类型转换规则

  1. 字符串和数字之间的比较,ES5规范11.9.3.4-5规定如下 x == y
    (1) 如果Type(x) 是数字,Type(y) 是字符串,则返回x == ToNumber(y) 的结果。

    (2) 如果Type(x) 是字符串,Type(y) 是数字,则返回ToNumber(x) == y 的结果。

    总结 数字与字符串相比,比较的是将字符串转为数字

  2. 其他类型和布尔类型的比较, ES5规范11.9.3.4-5规定如下 x == y
    (1) 如果Type(x) 是布尔类型,则返回ToNumber(x) == y 的结果;

    (2) 如果Type(y) 是布尔类型,则返回x == ToNumber(y) 的结果。

    总结 其他类型与布尔类型比,现将布尔类型转为数字,然后执行数字与数字之间的比较或数字与字符串之间的比较

  3. undefined和null之间的转换
    (1) 如果x 为null,y 为undefined,则结果为true。

    (2) 如果x 为undefined,y 为null,则结果为true。

    总结 在== 中null 和undefined 是一回事,可以相互进行隐式强制类型转换。其他值都不存在这种情况

  4. 对象与非对象之间的相等比较
    (1) 如果Type(x) 是字符串或数字,Type(y) 是对象,则返回x == ToPrimitive(y) 的结果

    (2) 如果Type(x) 是对象,Type(y) 是字符串或数字,则返回ToPromitive(x) == y 的结果

    为了将值转换为相应的基本类型值,抽象操作ToPrimitive(参见ES5 规范9.1 节)会首先(通过内部操作DefaultValue,参见ES5 规范8.12.8 节)检查该值是否有valueOf() 方法。如果有并且返回基本类型值,就使用该值进行强制类型转换。如果没有就使用toString()的返回值(如果存在)来进行强制类型转换。如果valueOf() 和toString() 均不返回基本类型值,会产生TypeError 错误。

三 两个比较特殊的==判断
1. NaN == NaN // =>false
2. [] == ![] // => true

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值