JavaScript if(x),==和===解析(翻譯整理)
阿新 • • 發佈:2017-05-14
ise work word any abc exp string ota always
一、if()中的布爾判斷
if
( Expression ) 表達式會通過ES5定義的ToBoolean方法強制把Expression 轉換成布爾值。
數據類型 | 轉換結果 |
Undefined | false |
Null | false |
Boolean | 不變 |
Number | +0, ?0, or NaN 轉換為false; 其他的轉換為true. |
String | 空字符串或長度為0的字符串轉換為false; 其他的轉換為true. |
Object | true |
示例:
var trutheyTester = function(expr) { return expr ? "truthey" : "falsey"; } trutheyTester({}); //truthey (an object is always true) trutheyTester(false); //falsey trutheyTester(new Boolean(false)); //truthey (an object!) trutheyTester(""); //falsey trutheyTester(new String("")); //truthey (an object!) trutheyTester(NaN); //falseytrutheyTester(new Number(NaN)); //truthey (an object!)
二、==
會對不同類型的數據進行強制轉換以比較,記住兩點即可:
- undefined和null永遠互相相等
- 當兩個不同類型的值進行比較,Object會被toPrimitive()轉化為原始值,String和Boolean會被toNumber()轉換為數字或NaN
Type(x) | Type(y) | Result |
x和y是同一種數據類型 | 和===判斷原則一樣一樣 | |
null | Undefined | true |
Undefined | null | true |
Number | String | x == toNumber(y) |
String | Number | toNumber(x) == y |
Boolean | (any) | toNumber(x) == y |
(any) | Boolean | x == toNumber(y) |
String or Number | Object | x == toPrimitive(y) |
Object | String or Number | toPrimitive(x) == y |
otherwise… | false |
toNumber()的轉換規則:
形式參數類型 | 結果 |
Undefined | NaN |
Null | +0 |
Boolean |
true -->1; false-->+0; |
Number | 不變 |
String | “abc” -> NaN “123” -> 123 |
Object |
1. Let primValue be ToPrimitive(input argument, hint Number). |
ToPrimitive()轉換規則:
形式參數 | 結果 |
Object | (在做相等判斷進行強制轉換時)先調用valueOf(),沒有返回值再調用toString(),還沒有返回值則報錯。 |
otherwise… | 不變 |
示例:
[0] == true;
1 //EQUALITY CHECK... 2 [0] == true; 3 4 //HOW IT WORKS... 5 //convert boolean using toNumber 6 [0] == 1; 7 //convert object using toPrimitive 8 //[0].valueOf() is not a primitive so use... 9 //[0].toString() -> "0" 10 "0" == 1; 11 //convert string using toNumber 12 0 == 1; //false!
“potato” == true;
//EQUALITY CHECK... "potato" == true; //HOW IT WORKS... //convert boolean using toNumber "potato" == 1; //convert string using toNumber NaN == 1; //false!
“potato” == false;
//EQUALITY CHECK... "potato" == false; //HOW IT WORKS... //convert boolean using toNumber "potato" == 0; //convert string using toNumber NaN == 0; //false!
object with valueOf;
//EQUALITY CHECK... crazyNumeric = new Number(1); crazyNumeric.toString = function() {return "2"}; crazyNumeric == 1; //HOW IT WORKS... //convert object using toPrimitive //valueOf returns a primitive so use it 1 == 1; //true!
object with toString;
//EQUALITY CHECK... var crazyObj = { toString: function() {return "2"} } crazyObj == 1; //HOW IT WORKS... //convert object using toPrimitive //valueOf returns an object so use toString "2" == 1; //convert string using toNumber 2 == 1; //false!
三、===
值和類型都必須嚴格相等:
- 不同類型永遠不相等
- 對象必須引用自同一個對象才相等
- 字符串必須包含相同的字符集合
- 原型(primitives)共享同一個值才相等
- NaN, null and undefined永遠不和其他類型相等
- NaN甚至不會和自己相等
數據類型 | 值 | 結果 |
二者類型不同 | false | |
Undefined or Null | true | |
Number | 二者值相等,除了NaN | true |
String | 二者包含相同的字符 | true |
Boolean | 二者都是true或false | true |
Object | 二者引用自同一個對象 | true |
otherwise… | false |
參考資料:
1. 《Truth, Equality and JavaScript 》:https://javascriptweblog.wordpress.com/2011/02/07/truth-equality-and-javascript/
JavaScript if(x),==和===解析(翻譯整理)