相等操作符(==)的隐式转换
使用相等操作符,当两个操作数类型不相等时,会在比较前尝试将其转换为相同类型。转换规则如下
- 数字和字符串比较,字符串会转换成数字值(
ToNumber
) - 其中一个操作数为布尔值,会将布尔值转换为数值,如果为
true
则转换为1
,如果为false
则转换为0
null == undefined
和undefined == null
返回true
- 一个对象和数字或字符串比较,JavaScript会尝试返回对象的默认值。操作符会尝试通过
valueOf
和toString
将对象转换成原始值(ToPrimitive
) - 两个操作数均为对象,当它们的引用相同则返回
true
NaN == NaN; //false +0 == -0; //true
原始数据 (原始值、原始数据类型)是一个非
object
类型并且没有自己的方法的数据。在 JavaScript 中,有六种原始数据类型:string
,number
,boolean
,null
,undefined
,symbol
。除了null
和undefined
,所有原始值都有包裹这个原始值的等价对象,这个包裹对象的valueOf()
方法返回原始值。
ToNumber
和ToPrimitive
上述转换涉及到两个内部的方法ToNumber
和ToPrimitive
。
ToNumber
ToNumber
方法对不同类型返回结果如下
- 布尔值,
true
–>1
,false
–>+0
undefined
–>NaN
null
–>+0
- 数字,数字对应值
- 字符串,只包含有效数字格式字符串,转换为对应十进制数值(空字符转化为
0
),其他转换为NaN
。- 字符串只包含数字(包括前面正负号)字符串’123’–>
123
,’011’–>11
(前导零忽略) - 字符串是有效的浮点数,转换为对应的浮点数值
- 字符串是有效的十六进制’0x12’–>
18
- 字符串只包含数字(包括前面正负号)字符串’123’–>
- 对象,
ToNumber(ToPrimitive(value, Number))
ToPrimitive
ToPrimitive(input, [PreferredType])
将input转换成原始值,如果一个对象可以转换成多种原始值,可以通过PreferredType转换成指定类型。
ToPrimitive
转换规则如下
input
为原始值,则返回输入值input
为对象,则需要通过PreferredType来确定
PreferredType设置为String
- 调用该对象
toString
方法,结果是原始值,则返回结果 - 调用该对象
valueOf
方法,结果是原始值,则返回结果 - 抛出
TypeError
异常
PreferredType设置为Number
- 调用该对象
valueOf
方法,结果是原始值,则返回结果 - 调用该对象
toString
方法,结果是原始值,则返回结果 - 抛出
TypeError
异常
当PreferredType没有设置值时,如果该对象为Date
类型,行为与设置String一致,其他与设置Number一致。
http://www.ecma-international.org/ecma-262/5.1/#sec-9.1
http://www.ecma-international.org/ecma-262/5.1/#sec-8.12.8
valueOf
和toString
方法
Object.prototype
包含valueOf
和toString
这两个方法,所以继承至Object
的对象都可以调用(如果对象重写了该方法,则调用自身)。
valueOf
JavaScript的内置对象都重写了valueOf
方法,以实现更适合自身的功能需要。常见的返回值如下
- 对象有原始值(
number
,string
,boolean
,symbol
),返回原始值 Date
对象,返回毫秒数(UTC)- 其他,返回对象本身
|
|
toString
调用toString
返回值如下
- 该对象重写了
toString
方法,如Number
、Boolean
、String
、Array
、Date
、Function
、RegExp
null
和undefined
通过call
调用toString
(Object.prototype.toString.call(null)
),分别返回[object Null]
和[object Undefined]
- 否则继承自
Object.prototype
,返回'[object type]'
,其中type
是对象的类型
|
|
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/valueOf
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/toString
示例
|
|
!
优先级比==
高,!{}
结果为false
[] == false
,其中一个操作数为布尔值,先将布尔值转为数值ToNumber
,false
转为数值结果为0
[] == 0
,对象与数值比较,将对象转换为原始值ToPrimitive(value, Number)
(Date
类型ToPrimitive(value, String)
)。- 先调用
valueOf
方法,回返回[]
本身,此时不是原始值,然后调用toString
方法返回''
空 '' == 0
字符串与数值比较,字符串转换为数值ToNumber
,空字符转换为数值结果为0
,所以最终表达式为0 == 0
,返回true