zoukankan      html  css  js  c++  java
  • js中等性操作符(==)、关系操作符(<,>)和布尔操作符(!)比较规则

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

    等性操作符(==)

    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、操作数是对象

    任何对象都返回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
  • 相关阅读:
    Java 类和Static关键字
    算法与数据结构实验题 6.4 Summary
    Django-----vue结合上传图片
    Django----模板继承&过滤器
    Django-----多对多示例查询
    Django-----验证码
    Django-----序列化--jwt
    Django-----文件配置
    Django-----删除--批量删除
    Django-----图文混排
  • 原文地址:https://www.cnblogs.com/sunshq/p/4016453.html
Copyright © 2011-2022 走看看