doubleyong
管理员
管理员
  • 最后登录2025-12-02
  • 发帖数1198
  • 最爱沙发
  • 喜欢达人
  • 原创写手
  • 社区居民
  • 忠实会员
阅读:7244回复:0

js中等性操作符(==)、关系操作符(<,>)和布尔操作符(!)比较规则

楼主#
更多 发布于:2017-03-22 23:12
题:
      console.log(true == 5);
      console.log(flase == 5);
      console.log(true == 1);
      console.log(true == '1');
      console.log('true' == true);
      console.log(123 == '123');
      console.log(false=='');
      console.log(flase == '0');
      console.log('abc' == false);
      (请先写出你心目中的答案,然后在运行上的代码,看看是否完全正确; 然后在看下面的文章,在回过头来看,欢迎写出你的答案)



原文引用:http://www.cnblogs.com/soulcm/p/4011568.html
最近一直在笔试面试,经常碰到例如 123=='123''abc'==true等问题,其中有答对的,也有答错的,主要原因还是对ECMAScript的规范没有理解清楚,很多题目没有具体分析所导致。现查阅资料后对此进行一些总结。

等性操作符(==)



1、比较的类型是String、Number、Boolean这几个基本类型时


当是这几中类型进行比较时,会先将两边转换成数字(一定注意,是将两边都先转换成数字,然后在进行比较),在进行比较。

 console.log(1 == true); // true转换成数字为1,因此结果为true
 console.log('123' == 123); //true
console.log('abc' == true); //'abc'转换成数字为NaN,结果为false,ECMAScript规定,NaN与任何值比较都是false,包括NaN==NaN


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 = { 1
2 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、操作数是对象


任何对象都返回false

1 var obj = {};
2 console.log(!obj); //false


2、操作数是字符串


空字符串返回true,非空返回false


1 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)返回false

4、操作数是null,undefined,NaN


返回true

1 console.log(!null); //true
2 console.log(!NaN); //true
3 console.log(!undefined); //true

最新喜欢:

小达人小达人
知识需要管理,知识需要分享
游客


返回顶部

公众号

公众号