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再取反,即为==的结果.
原文地址:https://www.cnblogs.com/peterzhangsnail/p/12521661.html