zoukankan      html  css  js  c++  java
  • js比较运算符

    1. 比较运算符分类: “相等"与"非相等”

      • “非相等”: 大于(>),小于(<),大于等于(>=),小于等于(<=)
      • “相等”: 相等 与 不等 (严格与一般)
    2. “非相等”
      依据ECMA-262 5.1版本,js非相等比较的实现是依靠一个抽象关系比较算法实现的.而这个算法主要由一个比较器和数据类型转换的ToPrimitive抽象操作构成.
      参考资料:抽象关系比较算法 , ToPrimitive抽象操作 , 四种关系运算符的实现逻辑
      (关于数据类型转换,也可以参考我的另一篇笔记: 加法与数据类型转换)
      1.抽象关系比较算法(The Abstract Relational Comparison Algorithm)
      说明:
      (1)当被比较的两个表达式x和y都是字符串时,逐字符比较两串各个字符的Unicode码点,最后得出结果.

      (2)当x和y之中至少有一个不是字符串时:
      任务: 两个表达式x和y作某种比较

      • 这个算法就只有一个比较器,用于判断左边的值是否比右边的值小

      • 计算x和y两表达式的值px和py

      • px和py之中,先进行ToPrimitive转换为数值的,其转换结果作为比较器左边的输入;后转换的,其值作为右边的输入.(注意:是左边输入还是右边输入不是按照x,y相对于比较运算符的位置而决定的,而是由px和py的被转换顺序决定的)

      • 标志位LeftFirst是一个Booelan值,决定了px和py谁先被转换.(true: px 先被转换为数值; false: py 先被转换为数值)

      • 四种关系的比较由LeftFirst(转换顺序)对比较器的结果的处理语句配合实现:

        • “<”: LeftFirst = true , 对比较器结果r处理:r为undefined,返回false;其余,返回r
        • ‘’>": LeftFirst = false,其余与<相同
        • “<=”: LeftFirst = false , 对r的处理:r为undefined,返回false,其余,对r取反(除undefined外,相当于>的补集)
        • “>=”: LeftFirst = true , 对r的处理:r为undefined,返回false;其余,对r取反(除undefined外,相当于<的补集)

        总结:
        1.当x与y中至少有一个不是字符串时,比较的是转换为number类型后的值.(因为指定ToPrimitive的hint为number)
        2.因为当r=undefiend时,此时至少有一个表达式的结果为NaN(px与py至少一个为NaN),故统一返回false.
        3.当两表达式的计算结果均非NaN时,>和<可由LeftFirst取值不同而分别得到;<=与>=可由相同条件下的>和<分别求反得到.

    3. 相等
      1.严格相等:

      • 严格相等比较算法:参考资料

        • x与y类型不同,返回false

        • undefined与null与自身严格相等

        • x,y均为Number,

          • 至少有一个为NaN,一律返回false
          • 正0负0,严格相等
          • 其余情况,若x,y值相等,返回true;否则一律返回false
        • x,y 均为String:完全相同的字符串时,返回true,否则返回false.

        • x,y 均为Boolean:同为true或同为false时,返回true,否则返回false.

      • 严格相等与严格不相等的实现:

        • “= = =” : 计算表达式x与y的结果值,带入严格相等比较算法,其算法结果r即为===的结果.
        • “! = =”: 计算表达式x与y的结果值,带入严格相等比较算法,对算法结果r取反,作为!==的结果

      2.一般相等:

      • 抽象相等比较算法:参考资料
        • 如果x与y类型相同:
          • 均为undefined或null,返回true
          • 均为Number类型:
            • 若x,y至少有一个为NaN,返回false
            • 正0与负0相等,返回true
            • 其余情况,x与y值相同,返回true;否则,返回false
          • 均为String类型,当x与y为完全相同的字符串时,返回true;否则返回false
          • 均为Boolean类型,x与y相同时返回true;否则返回false
          • 均为复合类型时,x与y指向同一个的对象/数组/函数时,返回true;否则返回false.(地址值相同)
        • 如果x与y类型不同时:
          • undefined与null相等,返回true;undefined/null与其它数据类型比较,一律返回false.
          • 其余情况时,存在数据类型的隐式转换:
            • x,y为原始类型里三种中的两种时,String与Boolean先ToNumber为Number,再进行比较
            • x,y中有一个为复合类型时,先将其ToPrimitive为原始类型,再进行比较
      • 一般相等与一般不相等的实现:
        • = =: 计算表达式x与y的值,将结果带入抽象相等比较算法中,所得结果r即为==的结果.
        • ! =: 计算表达式x与y的值,将结果带入抽象相等比较算法中,所得结果r再取反,即为==的结果.
  • 相关阅读:
    CGCDSSQ
    100200H
    斗地主
    借教室
    bzoj 3743
    17B
    能量项链
    589
    16-求连续数组和最大
    15-幸运数组4、7
  • 原文地址:https://www.cnblogs.com/peterzhangsnail/p/12521661.html
Copyright © 2011-2022 走看看