# ===
===運算符用于比較兩個值的相等。
這個值就是指原始值以及引用值。
因此,會有以下結論:
* 不同類型的比較,返回false。
* 相同原始類型的值比較時,值相等返回true,值不等返回false。
* 相同類(class)的對象比較時,則比較他們是否指向同一個對象。
~~~
var foo = {};
foo === {};//false
~~~
而!==相當于===的結果取反。
# ==
當==運算符用于兩種不同類型的值時,不會直接返回false,而是會發生類型轉換,再進行相等的比較。
* 比較不同原始類型的值時,會進行類型轉換,再進行===的比較。
注:在實現上,原始類型的值都會一致轉換成Number數值。
~~~
0 == '0';//true;
~~~
* 比較一個值和一個對象時,則將對象轉換成該值的原始類型,再進行===的比較。
注:對象可以通過重寫toString/valueOf函數,主動地控制他轉換成String/Number類型時的值。
~~~
var foo = {};
foo == foo.toString();//true
foo == foo.valueOf();//true
~~~
而!=相當于==的結果取反。
# How和What
網絡上關于ES比較運算的描述更加詳盡,有人樂此不疲統計著各種各樣的情況,甚至還畫出一個巨大的關系圖。
作為獵奇是很有趣的,作為學習我則是十分不推崇這種方法。
甚至是上文的結論一二三,閱讀他可以輔助我理解===的比較方式,記憶他卻會成為障礙。
一樣東西,因為他是什么,所以才有他的行為。
并不是他有了那些行為,他才是那樣的東西。
描述怎么的(How)往往要比描述是什么(What)要繁瑣得多。
**而且,程序語言是一門完備的科學,不需要用統計的方式去進行黑盒測試!**
但程序語言的實現往往不完備,所以我們才需要控制臺去驗證ES的細節,然后在編程中規避出現的缺陷。