JavaScript高级程序设计之基本概念之关系操作符第3.5.6讲笔记
2015-09-26 13:22
519 查看
小于(<)、大于(>)、小于等于(<=)和大于等于(>=)这几个关系操作符用于对两个值进行比
较,比较的规则与我们在数学课上所学的一样。这几个操作符都返回一个布尔值,如下面的例子所示:
var result1 = 5 > 3; //true
var result2 = 5 < 3; //false
与 ECMAScript 中的其他操作符一样,当关系操作符的操作数使用了非数值时,也要进行数据转换
或完成某些奇怪的操作。以下就是相应的规则。
如果两个操作数都是数值,则执行数值比较。
如果两个操作数都是字符串,则比较两个字符串对应的字符编码值。
如果一个操作数是数值,则将另一个操作数转换为一个数值,然后执行数值比较。
如果一个操作数是对象,则调用这个对象的valueOf()方法,用得到的结果按照前面的规则执
行比较。如果对象没有valueOf()方法,则调用toString()方法,并用得到的结果根据前面
的规则执行比较。
如果一个操作数是布尔值,则先将其转换为数值,然后再执行比较。
在使用关系操作符比较两个字符串时,会执行一种奇怪的操作。很多人都会认为,在比较字符串值
时,小于的意思是“在字母表中的位置靠前”,而大于则意味着“在字母表中的位置靠后”,但实际上完
全不是那么回事。在比较字符串时,实际比较的是两个字符串中对应位置的每个字符的字符编码值。经
过这么一番比较之后,再返回一个布尔值。由于大写字母的字符编码全部小于小写字母的字符编码,因
此我们就会看到如下所示的奇怪现象:
var result = "Brick" < "alphabet"; //true
在这个例子中,字符串"Brick"被认为小于字符串"alphabet"。原因是字母B 的字符编码为66,
而字母a 的字符编码是97。如果要真正按字母表顺序比较字符串,就必须把两个操作数转换为相同的大
小写形式(全部大写或全部小写),然后再执行比较,如下所示:
var result = "Brick".toLowerCase() < "alphabet".toLowerCase(); //false
通过将两个操作数都转换为小写形式,就可以得出"alphabet"按字母表顺序排在"Brick"之前的
正确判断了。
另一种奇怪的现象发生在比较两个数字字符串的情况下,比如下面这个例子:
var result = "23" < "3"; //true
确实,当比较字符串"23"是否小于"3"时,结果居然是true。这是因为两个操作数都是字符串,
而字符串比较的是字符编码("2"的字符编码是50,而"3"的字符编码是51)。不过,如果像下面例子
中一样,将一个操作数改为数值,比较的结果就正常了:
var result = "23" < 3; //false
此时,字符串"23"会被转换成数值23,然后再与3 进行比较,因此就会得到合理的结果。在比较
数值和字符串时,字符串都会被转换成数值,然后再以数值方式与另一个数值比较。当然,这个规则对
前面的例子是适用的。可是,如果那个字符串不能被转换成一个合理的数值呢?比如:
var result = "a" < 3; // false,因为"a"被转换成了NaN
由于字母"a"不能转换成合理的数值,因此就被转换成了NaN。根据规则,任何操作数与NaN 进行
关系比较,结果都是false。于是,就出现了下面这个有意思的现象:
var result1 = NaN < 3; //false
var result2 = NaN >= 3; //false
按照常理,如果一个值不小于另一个值,则一定是大于或等于那个值。然而,在与NaN 进行比较时,
这两个比较操作的结果都返回了false。
较,比较的规则与我们在数学课上所学的一样。这几个操作符都返回一个布尔值,如下面的例子所示:
var result1 = 5 > 3; //true
var result2 = 5 < 3; //false
与 ECMAScript 中的其他操作符一样,当关系操作符的操作数使用了非数值时,也要进行数据转换
或完成某些奇怪的操作。以下就是相应的规则。
如果两个操作数都是数值,则执行数值比较。
如果两个操作数都是字符串,则比较两个字符串对应的字符编码值。
如果一个操作数是数值,则将另一个操作数转换为一个数值,然后执行数值比较。
如果一个操作数是对象,则调用这个对象的valueOf()方法,用得到的结果按照前面的规则执
行比较。如果对象没有valueOf()方法,则调用toString()方法,并用得到的结果根据前面
的规则执行比较。
如果一个操作数是布尔值,则先将其转换为数值,然后再执行比较。
在使用关系操作符比较两个字符串时,会执行一种奇怪的操作。很多人都会认为,在比较字符串值
时,小于的意思是“在字母表中的位置靠前”,而大于则意味着“在字母表中的位置靠后”,但实际上完
全不是那么回事。在比较字符串时,实际比较的是两个字符串中对应位置的每个字符的字符编码值。经
过这么一番比较之后,再返回一个布尔值。由于大写字母的字符编码全部小于小写字母的字符编码,因
此我们就会看到如下所示的奇怪现象:
var result = "Brick" < "alphabet"; //true
在这个例子中,字符串"Brick"被认为小于字符串"alphabet"。原因是字母B 的字符编码为66,
而字母a 的字符编码是97。如果要真正按字母表顺序比较字符串,就必须把两个操作数转换为相同的大
小写形式(全部大写或全部小写),然后再执行比较,如下所示:
var result = "Brick".toLowerCase() < "alphabet".toLowerCase(); //false
通过将两个操作数都转换为小写形式,就可以得出"alphabet"按字母表顺序排在"Brick"之前的
正确判断了。
另一种奇怪的现象发生在比较两个数字字符串的情况下,比如下面这个例子:
var result = "23" < "3"; //true
确实,当比较字符串"23"是否小于"3"时,结果居然是true。这是因为两个操作数都是字符串,
而字符串比较的是字符编码("2"的字符编码是50,而"3"的字符编码是51)。不过,如果像下面例子
中一样,将一个操作数改为数值,比较的结果就正常了:
var result = "23" < 3; //false
此时,字符串"23"会被转换成数值23,然后再与3 进行比较,因此就会得到合理的结果。在比较
数值和字符串时,字符串都会被转换成数值,然后再以数值方式与另一个数值比较。当然,这个规则对
前面的例子是适用的。可是,如果那个字符串不能被转换成一个合理的数值呢?比如:
var result = "a" < 3; // false,因为"a"被转换成了NaN
由于字母"a"不能转换成合理的数值,因此就被转换成了NaN。根据规则,任何操作数与NaN 进行
关系比较,结果都是false。于是,就出现了下面这个有意思的现象:
var result1 = NaN < 3; //false
var result2 = NaN >= 3; //false
按照常理,如果一个值不小于另一个值,则一定是大于或等于那个值。然而,在与NaN 进行比较时,
这两个比较操作的结果都返回了false。
相关文章推荐
- JQuery1——基础($对象,选择器,对象转换)
- Android学习笔记(二九):嵌入浏览器
- Android java 与 javascript互访(相互调用)的方法例子
- Extjs4.0 最新最全视频教程
- Javascript中toFixed方法的改进
- JavaScript演示排序算法
- javascript实现10进制转为N进制数
- 5个常见可用性错误和解决方案
- 如何成为一名专家级的开发人员
- 肯特·贝克:改变人生的代码整理魔法
- 你应该学习哪种编程语言?
- 2019年开发人员应该学习的8个JavaScript框架
- HTML中的script标签研究
- 对一个分号引发的错误研究
- 异步流程控制:7 行代码学会 co 模块
- ES6 走马观花(ECMAScript2015 新特性)
- JavaScript拆分字符串时产生空字符的原因
- Canvas 在高清屏下绘制图片变模糊的解决方法
- [转]我们需要一种其他人能使用的编程语言