您的位置:首页 > Web前端 > JavaScript

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

2018-01-12 10:20 579 查看

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

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

ToPrimitive

抽象操作ToPrimitive会检查该值是否有valueOf()方法,如果有且返回基本类型值,就使用该值进行强制类型转换。如果没有就使用toString()方法的返回值(如果存在)来进行强制类型转换。

ToString 非字符串到字符串的强制转换

null =》 “null”

undefined =》 “undefined”

true => “true”

Array =》join(“,”)

对普通对象来说,除非自行定义,否则toString()返回内部属性[[Class]]的值,如 [object Object]

ToNumber

true =》 1

undefined =》 NaN

null =》 0

“” => +0

对象

(1) 令primValue为 ToPrimitive(输入参数, 暗示数值类型)。

(2) 返回 ToNumber(primValue)。

(3) 如果valueOf()和toString()均不返回基本类型值,会产生TypeError错误

ToBoolean 会被转换为假值的值

0,+0,-0,NaN

“”

undefined

null

false

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

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

字符串和数字之间的比较,ES5规范11.9.3.4-5规定如下 x == y

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

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

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

其他类型和布尔类型的比较, ES5规范11.9.3.4-5规定如下 x == y

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

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

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

undefined和null之间的转换

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

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

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

对象与非对象之间的相等比较

(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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  javascript