跳到主要内容

相等

2024年03月11日
柏拉文
越努力,越幸运

一、认识


等于运算符==检查其两个操作数是否相等,并返回Boolean结果。比较期间会尝试强制类型转换并且比较不同类型的操作数。

二、语法


三、规则


相等运算符==使用抽象相等比较算法比较两个操作数(强制类型转换)逻辑如下:

  • 如果两个操作数都是对象,则仅当两个操作数都引用同一个对象时才返回true

  • 如果一个操作数是null,另一个操作数是undefined,则返回true

  • 如果两个操作数是不同类型的,就会尝试在比较之前将它们转换为相同类型

    • 当数字与字符串进行比较时,会尝试将字符串转换为数字值

    • 如果操作数之一是Boolean,则将布尔操作数转换为 10

      • 如果是true,则转换为1
      • 如果是 false,则转换为0
    • 如果操作数之一是对象,另一个是数字或字符串,会尝试使用对象的valueOf()toString()方法将对象转换为原始值

  • 如果操作数具有相同的类型,则将它们进行如下比较

    • String: true仅当两个操作数具有相同顺序的相同字符时才返回。

    • Number: true仅当两个操作数具有相同的值时才返回。+0并被-0视为相同的值。如果任一操作数为NaN,则返回false

    • Boolean: true仅当操作数为两个true或两个false时才返回true

四、问题


4.1 null >= null 为什么是 true

检验

console.log(null >= null) // true

原因

>= 大于等于操作符,要求两边必须为数值类型,所以要对null强制类型转换,内部执行ToNumber(null) 输出0 , 所以最后的表达式为null >= null 可以转化为 0 >= 0 , 结果为 true

4.2 undefined >= undefined 为什么是 false

检验

console.log(undefined >= undefined) // false

原因

>= 大于等于操作符,要求两边必须为数值类型,所以要对undefined强制类型转换,内部执行ToNumber(undefined) 输出NaN , 所以最后的表达式为undefined >= undefined 可以转化为 NaN >= NaN , 由于 NaN 不大于、等于、小于任何值,所以结果为false

4.3 [] == ![] 为什么是 true?

检验

console.log([] == ![]) // true

原因

  • == 等于操作符,要求两边必须为数值类型,![] 将数据类型转化为 Boolean 类型 false , 继续将Boolean 转化为了 Number 类型 0

  • 此时== 有一边为Number类型,那么另一边[] 要强制转换Number ,调用ToNumber([])

  • ToPrimitive 内部会调用ToPrimitive([],Number)

  • ToPrimitive([],Number) 内部首先执行 [].valueOf() 结果为引用类型的 [] 不为原始数据类型,继续调用[].toString() 结果为空字符串

  • 得到的空字符串继续执行ToNumber("") 结果为 0

  • 因此 [] == ![] 可以转化为 0 == 0 , 所以结果为 true