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的后面

    小于等于

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

    小于

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

    大于等于

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

    优秀文章首发于聚享小站,欢迎关注!
  • 相关阅读:
    Largest Submatrix of All 1’s
    Max Sum of Max-K-sub-sequence
    Sticks Problem
    Splay模版
    B. Different Rules
    链表合并 leetcode
    K个一组翻转链表
    反转链表2 leetcode
    nodejs简单仿apache页面
    HTML 5 Web Workers
  • 原文地址:https://www.cnblogs.com/yesyes/p/15351353.html
Copyright © 2011-2022 走看看