3

关系运算符

关系运算符有小于(<)、大于(>)、小于等于(<=)和大于等于(>=)四种,它们都返回一个布尔值

《javascript高级程序设计》书中的规则是这样描述运算规则:

(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,视情况而定

"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

相等操作符

相等操作符有两组:相等和不相等—先转换再比较,全等和不全等—仅比较而不转换

== 和 != 两个操作符都会先转换操作数(通常称为强制转型),然后再比较它们的相等性

《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。

相等运算图谱:
图片描述

==> 图谱分析:
(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

=== 和 !== 两个操作符不会进行类型转换直接比较相等性

建议:在知晓变量类型的情况下使用全等和不全等进行判别


同梦奇缘
4.1k 声望1.1k 粉丝

生于忧患死于安乐