1.隱式轉換規則
Standard ECMA-262 6th Edition 對寬鬆相等(==)的定義如下:
Abstract Equality Comparison
The comparison x == y, where x and y are values, produces true or false. Such a comparison is performed as follows:
- 若x與y的型別相同, 則返回x===y的結果
- 若x=null,y=undefined,則return true。
- 若x=undefined,y=null,則return true。
- 若x的型別為Number,y的型別為String,則return x == ToNumber(y)的執行結果。
- 若x的型別為String,y的型別為Number,則return ToNumber(x) == y的執行結果。
- 若x的型別為Boolean, 則return ToNumber(x) == y的執行結果。
- 若y的型別為Boolean, 則return x == ToNumber(y)的執行結果。
- 若x的型別為String, Number或者Symboly,y的型別為 Object, 則 return x == ToPrimitive(y)的執行結果。
- 若x的型別為Object,y的型別為String, Number, 或者Symbol, 則 return ToPrimitive(x) == y的執行結果。
- 若以上都不滿足則return false
2.各隱式裝箱的定義
2.1 ToNumber(其他型別轉換為數字)
引數型別 | 結果 |
---|---|
Undefined | NaN |
Null | 0 |
Bollean | true => 1 fale => 0 |
Symbol | Throw a TypeError exception |
String | 如果字串能被解析為StringNumericLiteral(定義如下),則將字串轉換為相應的數字,否則ToNumber的結果為NaN |
Object | 1.先執行ToPrimitive操作,將object轉換為基本型別 2.執行ToNumber操作 |
StringNumericLiteral :::
StrWhiteSpace
StrWhiteSpaceopt StrNumericLiteral StrWhiteSpaceopt
StrWhiteSpace :::
StrWhiteSpaceChar StrWhiteSpaceopt
StrWhiteSpaceChar :::
WhiteSpace
LineTerminator
StrNumericLiteral ::::
StrDecimalLiteral
BinaryIntegerLiteral
OctalIntegerLiteral
HexIntegerLiteral
StrDecimalLiteral :::
StrUnsignedDecimalLiteral
+StrUnsignedDecimalLiteral
-StrUnsignedDecimalLiteral
StrUnsignedDecimalLiteral :::
Infinity
DecimalDigits . DecimalDigitsopt ExponentPartopt
. DecimalDigits ExponentPartopt DecimalDigits ExponentPartopt
DecimalDigits :::
DecimalDigit
DecimalDigits DecimalDigit
DecimalDigit ::: one of
0 1 2 3 4 5 6 7 8 9
ExponentPart :::
ExponentIndicator SignedInteger
ExponentIndicator ::: one of
e E
SignedInteger :::
DecimalDigits
+DecimalDigits
-DecimalDigits
2.2 ToPrimitive( input [, PreferredType] )
ToPrimitive根據PreferredType將input轉換為primitive基本型別,在ES6中使用者可自定義toPrimitive方法。
- input(null,undefined,string,number,bool,Symbol)->直接返回input
- input的型別為Date型別時(若使用者沒有改寫toPrimitive)->PreferedType=string,則:
a.呼叫input的toString方法,若result時primitive基本型別則返回result
b.否則,呼叫input的valueOf方法,若result時primitive基本型別,則返回result
c.否則,Throw a TypeError exception. - input為非Date的引用型別時(若使用者沒有改寫toPrimitive)->PreferedType=number,則:
a.呼叫input的valueOf方法,若result是primitive基本型別則返回result
b.否則,呼叫input的toString方法,若result是primitive基本型別,則返回result
c.否則,Throw a TypeError exception.
不同型別物件的valueOf()方法的返回值
物件 | 返回值 |
---|---|
Array | 返回陣列物件本身。 |
Boolean | 布林值。 |
Date | 儲存的時間是從 1970 年 1 月 1 日午夜開始計的毫秒數 UTC。 |
Function | 函式本身。 |
Number | 數字值。 |
Object | 物件本身。這是預設情況。 |
String | 字串值。 |
Math 和 Error 物件沒有 valueOf 方法。 |
2.3 ToString(其他型別轉為數字)
引數型別 | 結果 |
---|---|
Undefined | 'undefined' |
Null | 'null' |
Bollean | true =>'true' fale =>'fale' |
Symbol | Throw a TypeError exception |
Number | NaN => 'NaN' +0 or -0 => '0' +∞ => Infinity |
Object | 1.先執行ToPrimitive操作,將object轉換為基本型別 2.執行ToString操作 |
(1).""+value與String(value)都是運用內部函式toString將基本型別轉為字串的
(2).可通過Object.prototype.toString()來檢測每個物件的型別,但需要以Function.prototype.call()或者Function.prototype.apply()的形式來呼叫,如:Object.prototype.toString.call(function(){})=>"[object Function]"
2.4 ToBoolean
引數型別 | 結果 |
---|---|
Undefined | false |
Null | false |
String | 空字串 =》false,其他為true |
Symbol | true |
Number | +0, −0, or NaN => false,其他為true |
Object | true |