# ===
===运算符用于比较两个值的相等。
这个值就是指原始值以及引用值。
因此,会有以下结论:
* 不同类型的比较,返回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的细节,然后在编程中规避出现的缺陷。