zoukankan      html  css  js  c++  java
  • JS基础关系运算符

    关系运算符用于比较两个值之间的关系,关系成立则返回true,不成立则返回false, JS提供了===, !==, ==, !=, >, >=, <, <=八个关系运算符。

    恒等

    ===恒等比较运算符,先计算操作数的值,再比较计算后的值,比较过程不发生数据类型的转换,比较过程遵循以下规则:

    1. 两个值类型不同,返回false
    0 === '0'; // false
    0 === []; // false
    
    1. 两个值是原始数据类型,值相同返回true,值不同返回false
    // 以下都返回true
    'a' === 'a';
    1 === 1;
    true === true;
    null === null;
    undefined === undefined;
    

    注意: 数字在进行比较时,都会先转换为十进制再进行比较

    10 === 0b1010; // true  二进制
    10 === 0xa; // true  十六进制
    

    注意: NaN和任何值都不相等,数值0正负值恒等

    NaN === NaN; // false
    +0 === -0; // true
    
    1. 两个值引用同一对象则返回true,否则返回false

    对象在比较的时候,比较的是引用值,所以对象只和它自身相等,和任何其他对象都不相等

    [] === []; // false
    {} === {}; // false
    function() {} === function(){}; // false
    
    var o = {};
    var o1 = o;
    
    o === o1; // true
    

    恒不等

    !==恒不等的比较过程和恒等相同,所以比较结果就是恒等的相反结果。

    0 !== '0'; // true
    {} !== {}; // true
    null !== null; // false
    

    相等

    ==相等运算符和恒等运算符类似,当数据类型相同时,比较过程是一样的。当数据类型不同时,相等运算符会尝试进行数据类型转换,而恒等运算符不会进行数据类型转换。

    当数据类型相同时,由于和恒等运算符比较结果一样,所以不再赘述。

    当数据类型不同时,数据类型转换遵循以下规则:

    1. 对象转换为原始值后,如果至少一个操作数不是字符串,则两个操作数都会调用Number()转型函数转换成数值进行比较。
    1 == '1'; // true 
    true == '1'; // true
    false == '0'; // true
    null == '0'; // false
    undefined == '0'; // false  相当于NaN == 0
    null == undefined; // true  
    

    注意: 虽然Number(null)的结果是0,但是null == '0'的比较结果是false,这是因为JavaScript将null == undefined的结果设为true。Number(undefined)的结果是NaN。

    1. 对象转换为原始值后,如果两个操作数都是字符串,则进行字符串比较
    var o = {
      valueOf:function(){
         return 'a';
      }
    }
    
    o == 'a'; // true
    
    
    1. 如果操作数为引用类型,另一个操作数为原始类型,则引用类型先通过valueOf()获取原始值再进行比较,如果无法获得原始值,就通过toString()方法转换。
    [] == 0; // true  相当于 '' == 0
    [] == '0'; // false 相当于 '' == '0'
    
    var o = {
      valueOf:function(){
         return 1;
      },
      toString:function(){
         return 2;
      }
    } 
    
    o == 1; // true
    
    var o2 = {
      valueOf:function(){
          return {};
      },
      toString:function(){
          return '1';
      }
    } 
    
    o2 == 1; // true
    
    

    不相等

    !=不相等运算符的比较过程和相等运算符相同,结果与相等运算符相反,不再赘述。

    大于

    大于运算符的操作数可以是任何类型,但是只有数字和字符串会真正进行比较,其他类型的操作数会先进行类型转换,然后再进行比较。

    转换过程遵循上面提到的三条规则。

    重点说明下当两个操作数都是字符串时,是按照字母表的顺序进行比较的,字母表顺序是指组成这个字符串的16为Unicode字符的索引顺序。

    'b' > 'a'; // true
    'B' > 'a'; // false
    '2' > '11'; // true 2的Unicode值大于1的Unicode值
    
    ['b'] > ['a'];// true 相当于'b' > 'a',调用了自身的toString()方法
    ['2'] > ['11']; // true 相当于'2' > '11'
    

    由于大写字母排在字母表前面,所以所有大写字母都小于小写字母,考虑到自然语言的排序,可以通过localeCompare()方法获得符合认知的排序。它表示在字母表中如果字符串排在其参数之前,则返回一个负数,如果排在其参数之后则返回一个正数,如果相等则返回0。

    'C'.localeCompare('b'); // 1
    'c'.localeCompare('b'); // 1
    'a'.localeCompare('b'); // -1
    

    虽然大写字母排在字母表的前面,但是localeCompare()方法会考虑自然语言的排序,把C排在b的后面

    小于等于

    小于等于(<=)运算符并不依赖于小于或者等于运算符的比较结果,而是遵循大于运算符的比较结果,结果取反。

    小于

    小于(<)运算符的比较过程和大于运算符一样,同样遵循上面提到的三条规则,不再赘述。

    大于等于

    大于等于(>=)运算符并不依赖于大于或者等于运算符的比较结果,而是遵循小于运算符的比较结果,结果取反。

    优秀文章首发于聚享小站,欢迎关注!
  • 相关阅读:
    eclipse下c/cpp " undefined reference to " or "launch failed binary not found"问题
    blockdev 设置文件预读大小
    宝宝语录
    CentOS修改主机名(hostname)
    subprocess报No such file or directory
    用ldap方式访问AD域的的错误解释
    英特尔的VTd技术是什么?
    This virtual machine requires the VMware keyboard support driver which is not installed
    Linux内核的文件预读详细详解
    UNP总结 Chapter 26~29 线程、IP选项、原始套接字、数据链路访问
  • 原文地址:https://www.cnblogs.com/yesyes/p/15351353.html
Copyright © 2011-2022 走看看