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