hugh 的个人博客

忽略的知识点 - ==比较规则

规则

  1. 如果 Type(x) 和Type(y)一致, 执行下面的流程判断
    • 如果Type(x) 是undefined, 即都为undefined, return true
    • 如果Type(x) 是Null, 即都未null, 返回true
    • 如果Type(x) 是Number, 按
        1. 如果x是NaN或者y是NaN, 返回 false
        1. 如果是同样的数字, 返回true
        1. 如果分别是+0或-0, 返回true
        1. return false
    • 如果Type(x)是String, 包含相同的字符, 则返回true, 否则为false
    • 如果Type(x)是Boolean, 对于都是true或false, 返回true, 否则为false
    • 如果指向同一个对象引用, 返回true, 否则为false
  2. 如果x是null 且y是undefined, 返回true
  3. 如果x是undefined 且y是null, 返回true
  4. 如果有一侧的type为Number 且另一侧type是String, 则将另一侧转换成Number进行比较(toNumber)
  5. 如果有一侧的type为Boolean, 则将该侧的值转换成Number进行比较
  6. 如果type(x)是String或者Number或者Symbol, 且Type(y) 是Object, 则将y转换成原始类型比较ToPrimary(y)
  7. 如果type(x)是Object, 且Type(y) 是String或Number或者Symbol, 则将x转换成原始类型比较ToPrimary(x)
  8. return false

其中几个转换或判断行为

  1. type(x)
输入输出
Undefined"undefined"
Null"object"
Boolean"boolean"
String"string"
Number"number"
Symbol"symbol"
Object(native and does not implement [[Call]])"object"
Object(native and implement[[call]])"function"
  1. toNumber(x)
输入输出
UndefinedNaN
Null+0
Booleantrue ->1, false -> 0
NumberNumber
String, ObjecttoNumber(toPrimary())
  1. toPrimary(x)
输入输出
UndefinedUndefined
NullNull
BooleanBoolean
NumberNumber
StringString
Object[[DefaultValue]] 调用内部toString方法等

test

"1" == 1 //  1 ==1 true
true == 1 // 1 == 1 true
true == "true" //  1 == "true" => 1==NaN  false
true == "1" // 1 == 1 true
"1" == String("1") // "1" == "1" true
"1" == new String("1") // "1" == toPrimary(Object"1"); "1"=="1" true
null == undefined // return true
NaN == NaN // return false
0 == NaN // return false
[] == 0 //  [].toString() == [].join();  toNumber([].toString) == 0   true
[1,2] == "1,2" // true
0 == null // false, 因为不会做转换, 两个原始值直接比
({a:2}) == "[object Object]";// true  

var sy = Symbol(1)
new Object(sy) == sy //  true(typeof(new Object(sy))=="object")

标题:忽略的知识点 - ==比较规则
作者:hugh0524
地址:https://blog.uproject.cn/articles/2020/03/06/1583486899708.html

0 浏览