標籤:web func convert var function 報錯 top 參數 --
一、if()中的布爾判斷
if ( Expression ) 運算式會通過ES5定義的ToBoolean方法強制把Expression 轉換成布爾值。
| 資料類型 |
轉換結果 |
| Undefined |
false |
| Null |
false |
| Boolean |
不變 |
| Number |
+0, ?0, or NaN 轉換為false;
其他的轉換為true. |
| String |
Null 字元串或長度為0的字串轉換為false;
其他的轉換為true. |
| Object |
true |
樣本:
var trutheyTester = function(expr) { return expr ? "truthey" : "falsey";} trutheyTester({}); //truthey (an object is always true) trutheyTester(false); //falseytrutheyTester(new Boolean(false)); //truthey (an object!) trutheyTester(""); //falseytrutheyTester(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).
2. Return ToNumber(primValue). |
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 toNumber12 0 == 1; //false!
“potato” == true;
//EQUALITY CHECK..."potato" == true; //HOW IT WORKS...//convert boolean using toNumber"potato" == 1;//convert string using toNumberNaN == 1; //false!
“potato” == false;
//EQUALITY CHECK..."potato" == false; //HOW IT WORKS...//convert boolean using toNumber"potato" == 0;//convert string using toNumberNaN == 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 it1 == 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 toNumber2 == 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),==和===解析(翻譯整理)