关系运算符有小于(<)、大于(>)、小于等于(<=)和大于等于(>=)四种,它们都返回一个布尔值javascript
《javascript高级程序设计》书中的规则是这样描述运算规则:java
(1)若是两个操做数都是数值,则执行数值比较; (2)若是两个操做数都是字符串,则比较两个字符串对应的字符编码值; (3)若是一个操做数是数值,则将另外一个操做数转换为一个数值,而后执行数值比较; (4)若是一个操做数是对象,则调用这个对象的 valueOf()方法,用获得的结果按照前面> 的规则执行比较,若是对象没有 valueOf()方法,则调用 toString()方法,并用获得的结果根据前面的规则执行比较; (5)若是一个操做数是布尔值,则先将其转换为数值,而后再执行比较。
关系运算图谱:编码
==> 图谱分析:
(1)undefined本质是NaN,任何操做数与 NaN 进行关系比较,结果都是 false
(2)null本质是0,boolean本质是0或1
(3)若是两个操做数都是字符串,则比较两个字符串对应的字符编码值(a-97,A-65, 0-48);
(4)object可能隐式转换成numbe或者string,视状况而定spa
"Brick" < "alphabet"; // true "23" < "3"; // true "23" < 3; //false "a" < 3; // false,由于"a"被转换成了 NaN undefined < 1; // false,由于undefined会被转换成NaN undefined > 1; // false null < 1; // true,由于undefined会被转换成0
相等操做符有两组:相等和不相等—先转换再比较,全等和不全等—仅比较而不转换设计
== 和 != 两个操做符都会先转换操做数(一般称为强制转型),而后再比较它们的相等性code
《javascript高级程序设计》书中的规则是这样描述运算规则:对象
(1)若是有一个操做数是布尔值,则在比较相等性以前先将其转换为数值—false 转换为 0,而true 转换为 1; (2)若是一个操做数是字符串,另外一个操做数是数值,在比较相等性以前先将字符串转换为数值; (3)若是一个操做数是对象,另外一个操做数不是,则调用对象的 valueOf()方法,用获得的基本类型值按照前面的规则进行比较; 这两个操做符在进行比较时则要遵循下列规则。 (4)null 和 undefined 是相等的。 (5)要比较相等性以前,不能将 null 和 undefined 转换成其余任何值。 (6)若是有一个操做数是 NaN,则相等操做符返回 false,而不相等操做符返回 true。重要提示:即便两个操做数都是 NaN,相等操做符也返回 false;由于按照规则,NaN 不等于 NaN。 (7)若是两个操做数都是对象,则比较它们是否是同一个对象。若是两个操做数都指向同一个对象,则相等操做符返回 true;不然,返回 false。
相等运算图谱:blog
==> 图谱分析:
(1)null 和 undefined 是相等且不能将 null 和 undefined 转换成其余任何值
(2)对象是否相等由其指向决定
(3)boolean的本质依然是0和1,字符串和数值的比较要转成数值图片
null == undefined; // true "NaN" == NaN; // false 5 == NaN; // false NaN == NaN; // false NaN != NaN; // true false == 0; // true true == 1; // true true == 2; // false undefined == 0; // false null == 0; // false "5" == 5; //true
=== 和 !== 两个操做符不会进行类型转换直接比较相等性ip
建议:在知晓变量类型的状况下使用全等和不全等进行判别