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

來源:互聯網
上載者:User

標籤: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!)

 

二、==

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

  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 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!

三、===

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

  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),==和===解析(翻譯整理)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.