1. 程式人生 > >JavaScript if(x),==和===解析(翻譯整理)

JavaScript if(x),==和===解析(翻譯整理)

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); //falsey
trutheyTester(new Number(NaN)); //truthey (an object!)

二、==

會對不同類型的數據進行強制轉換以比較,記住兩點即可:

  1. undefined和null永遠互相相等
  2. 當兩個不同類型的值進行比較,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 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!

三、===

值和類型都必須嚴格相等:

  1. 不同類型永遠不相等
  2. 對象必須引用自同一個對象才相等
  3. 字符串必須包含相同的字符集合
  4. 原型(primitives)共享同一個值才相等
  5. NaN, null and undefined永遠不和其他類型相等
  6. 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),==和===解析(翻譯整理)