js中等性操作符(==)、关系操作符(<,>)和布尔操作符(!)比较规则
2014-10-10 17:38
302 查看
最近一直在笔试面试,经常碰到例如 123=='123'、'abc'==true等问题,其中有答对的,也有答错的,主要原因还是对ECMAScript的规范没有理解清楚,很多题目没有具体分析所导致。现查阅资料后对此进行一些总结。
对于undefined和null,ECMAScript规定null==undefined结果为true;在比较等性之前,不能将null和undefined转换成其他值。
与NaN比较的都将返回false
等性操作符(==)
1、比较的类型是String、Number、Boolean这几个基本类型时
当是这几中类型进行比较时,会先将两边转换成数字,在进行比较。1 console.log(1 == true); // true转换成数字为1,因此结果为true 2 3 console.log('123' == 123); //true 4 5 console.log('abc' == true); //'abc'转换成数字为NaN,结果为false,ECMAScript规定,NaN与任何值比较都是false,包括NaN==NaN 6
2、上述基本类型与引用类型比较时
首先会调用对象的valueOf()方法,期待返回一个基本类型的值(测试为若返回Boolean、Number、String、null、undefined或没有返回值,则将不会继续调用toString方法),若返回的仍然是一个复合对象的话,则调用其toString()方法,若仍然没有返回上述基本类型的话,则直接判为不相等。1 var obj = {}; 2 console.log(obj == '1') //obj.valueOf()返回这个对象,因此接着调用obj.toString()返回'[object Object]'字符串,按基本类型的比较方式,都转换成数字,发现不相等,因此结果是false 3 //重写obj的toString方法 4 obj.toString() = function(){ 5 return 1; 6 } 7 console.log(obj == '1'); //结果就为true了 8 console.log(obj == true); //结果也为true
1 var obj = { 2 valueOf : function(){ 3 console.log('first'); 4 }, 5 toString : function(){ 6 console.log('second'); 7 } 8 } 9 console.log(obj == 1); //结果为 first false 10 11 var obj = { 12 valueOf : function(){ 13 console.log('first'); 14 return null; //或者return undefined 15 }, 16 toString : function(){ 17 console.log('second'); 18 } 19 } 20 console.log(obj == 1); //结果为 first false 21 22 var obj = { 23 valueOf : function(){ 24 console.log('first'); 25 return {}; //或者return其他复合对象 26 }, 27 toString : function(){ 28 console.log('second'); 29 } 30 } 31 console.log(obj == 1); //结果为 first second false
对于undefined和null,ECMAScript规定null==undefined结果为true;在比较等性之前,不能将null和undefined转换成其他值。
1 console.log(null == undefined); //true 2 console.log(null == 0); //false 3 console.log(0 == undefined); //false
3、两个对象比较
若两个操作数指向同一个对象,则返回true,否则返回false。关系操作符(<,>)
1、两边都是字符串
都是字符串时,按字符串对应的字符编码比较1 console.log('abc'<'adc') //true
2、有一个操作数是数值
若有一个操作数是数值,则将另一个转换为数值进行比较1 console.log('a' > 5); //‘a'转换为数值为NaN,结果为false 2 console.log('2.3' > 1); // true
3、有一个操作数是对象
调用该对象的valueOf方法,用返回的结果用前面的规则比较,若没有valueOf方法,则调用toString方法1 var obj = {}; 2 console.log(obj < 5); //false 3 var obj = { 4 valueOf: function() { 5 console.log('first'); 6 return 2; 7 }, 8 toString: function() { 9 console.log('second'); 10 } 11 } 12 console.log(obj < 5); //first true
4、有一个操作数是布尔值
将此布尔值转换成数值,再进行比较1 console.log('3' > true); //true
与NaN比较的都将返回false
布尔操作符(!)
1、操作数是对象
任何对象都返回false1 var obj = {}; 2 console.log(!obj); //false
2、操作数是字符串
空字符串返回true,非空返回false1 var a = 'OK'; 2 var b = ' '; 3 var c = ''; 4 console.log(!a); //false 5 console.log(!b); //false 6 console.log(!c); //true
3、操作数是数值
0返回true,非0(包括Infinity)返回false4、操作数是null,undefined,NaN
返回true1 console.log(!null); //true 2 console.log(!NaN); //true 3 console.log(!undefined); //true
相关文章推荐
- js中等性操作符(==)、关系操作符(<,>)和布尔操作符(!)比较规则
- js中等性操作符(==)、关系操作符(<,>)和布尔操作符(!)比较规则
- +,<,>,<=,>=的运算比较规则
- python笔记 <记录一些比较杂的问题>
- if判断与比较操作符gt、lt、eq等的使用
- C# List<>与Array性能比较
- Dictionary,List<>,Hashtable比较
- 1点儿优化:比较两个List<String>中是否有相同的String
- 几个比较特殊的运算符(>>,<<,&)
- JavaScript中的比较操作符>、<、>=、<=介绍
- 判断时用比较(< or >) 替换 比对(==)防止递归越界
- sql 查询 between and 和 >= <= 比较
- Vertica的这些事<二>—— vertica建表的一些规则
- 在jsp中用<s:if test />比较两个变量
- 九度:1006<ZOJ问题><规则,规律>
- <c:set><c:if test=””>联合使用,使用el表达式对较复杂对象进行比较处理
- IComparer<T>:Linq比较接口
- HTML中几种为<button>绑定点击事件的方式比较
- Struts标签<s:if>比较字符窜
- 编写一个程序,将两个字符串s1和s2比较,如果s1 > s2,输出一个正数;s1 = s2,输出0,;s1 < s2输出一个负数。不要使用strcmp函数。