当前位置:嗨网首页>书籍在线阅读

05-比较运算符

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

5.4 比较运算符

比较运算符,顾名思义,可以用来比较两个不同的值。一般来说,有三种类型的比较运算符:严格相等、非严格(松散)相等、相关性。(通常不会把不相等看作一种不同的类型。不相等其实就是“相等”的反面,尽管为了方便起见,它有自己运算符)。

初学者最难理解的是严格相等和非严格相等之间的区别。下面将从严格相等开始,因为建议大家一般情况下尽量使用严格相等。两个值严格相等的前提是它们引用了同一个对象,或者拥有相同的类型和相同的值(这里指基本类型)。严格相等的好处是,它有一个简单明确的规则,降低了错误的发生率,并且不容易引发误解。要确定两个值是否严格相等,使用严格相等运算符(===)或者严格不相等运算符(!==)即可。在开始看示例代码之前,先来看看非严格相等运算符。

两个值非严格相等的前提是它们属于同一个对象(到目前为止),或者可以强制转换成相同的值。后者在实际操作时会有一些麻烦。不过有时候它也很有用。例如,想知道数字33和字符串"33"是否相等,非严格相等运算符会返回yes,但是严格相等运算符会返回no(因为它们的类型不同)。这种情况下,非严格相等用起来更方便,但同时也产生一些不好的编码行为。正因为如此,在这里建议先将字符串转换成数字,然后用严格相等运算符去做比较。非严格相等运算符是==,它的否定形式是!=。如果想了解更多关于非严格相等运算符在使用时需要注意的问题和陷阱,作者推荐一本由Douglas Crockford写的书:JavaScript: the Good Parts (O’Reilly)(《JavaScript语言精粹》)。

在使用非严格相等运算符时,产生的大多数问题都与 `null` 、 `undefined` 、空字符串,以及数字0有关。如果能确定要比较的值里没有这些值,使用非严格相等运算符也会安全一些。不过,不要低估机械性习惯的力量。所以建议始终选择严格等式运算符作为默认选项,这样就不用在比较时思考运算符是否合适。不用打断自己的思路去思考非严格相等运算符是否安全或使用它的好处;只需要使用严格相等,然后继续专注的工作。如果后面发现严格相等运算符的运行结果不对,可以适当做一些类型转换,而避免使用可能会带来更多问题的非严格相等运算符。编程是一件困难的事情,就当帮帮自己,避免使用那些有问题的非严格相等运算符。

下面是一些关于严格相等和非严格相等的例子。注意,即便对象a和对象b的内容相同,它们依旧是不同的对象,所以不论使用严格相等还是非严格相等比较它们,返回的结果都是false:

const n = 5;
const s = "5";
n === s;                                // false – 类型不同
n !== s;                                // true
n === Number(s);                        // true – 字符串"5" 转换成数字 5
n !== Number(s);                        // false
n == s;                                 // true; 不推荐
n != s;                                    // false; 不推荐
const a = { name: "an object" };
const b = { name: "an object" };
a === b;                                   // false – 不是同一个对象
a !== b;                                   // true
a == b;                                    // false; 不推荐
a != b;                                    // true; 不推荐

关系运算符比较的是两个值的关系,它们仅仅适用于拥有自然排序特性的数据类型,比如,字符串(“a”排在“b”之前)、数字(0排在1之前)。关系运算符有小于(<)、小于等于(<=)、大于(>)、大于等于(>=):

3 > 5;         // false
3 >= 5;        // false
3 < 5;         // true
3 <= 5;        // true
5 > 5;         // false
5 >= 5;        // true
5 < 5;         // false 
5 <= 5;        // true