规则
- 如果 Type(x) 和Type(y)一致, 执行下面的流程判断
- 如果Type(x) 是undefined, 即都为undefined, return true
- 如果Type(x) 是Null, 即都未null, 返回true
- 如果Type(x) 是Number, 按
-
- 如果x是NaN或者y是NaN, 返回 false
-
- 如果是同样的数字, 返回true
-
- 如果分别是+0或-0, 返回true
-
- return false
- 如果Type(x)是String, 包含相同的字符, 则返回true, 否则为false
- 如果Type(x)是Boolean, 对于都是true或false, 返回true, 否则为false
- 如果指向同一个对象引用, 返回true, 否则为false
- 如果x是null 且y是undefined, 返回true
- 如果x是undefined 且y是null, 返回true
- 如果有一侧的type为Number 且另一侧type是String, 则将另一侧转换成Number进行比较(toNumber)
- 如果有一侧的type为Boolean, 则将该侧的值转换成Number进行比较
- 如果type(x)是String或者Number或者Symbol, 且Type(y) 是Object, 则将y转换成原始类型比较ToPrimary(y)
- 如果type(x)是Object, 且Type(y) 是String或Number或者Symbol, 则将x转换成原始类型比较ToPrimary(x)
- return false
其中几个转换或判断行为
- 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" |
- toNumber(x)
输入 | 输出 |
Undefined | NaN |
Null | +0 |
Boolean | true ->1, false -> 0 |
Number | Number |
String, Object | toNumber(toPrimary()) |
- toPrimary(x)
输入 | 输出 |
Undefined | Undefined |
Null | Null |
Boolean | Boolean |
Number | Number |
String | String |
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")