- 前面自己看过《你不知道的 JS》中册,这里正好可以复习一下
-
JS 在判断
a > b
,21 种判断方法-
调用 b 的 ToPrimitive(hit number)
-
调用 a 的 ToPrimitive(hit number)
-
如果 Result(1)与 Result(2)都是字符串,跳转到 16 步
-
调用 ToNnumber(Result(1)):Result(4) b
-
调用 ToNumber(Result(2)): Result(5) a
-
如果 Result(4)为 NaN,return undefined
-
如果 Result(5)为 NaN,return undefined
-
如果 Result(4)和 Result(5)数字相同,return false
-
如果 Result(4)为+0,Result(5)为-0,return false
-
如果 Result(4)为-0,Result(5)为+0,return false
-
如果 Result(4)为 positive Infinity, return false
-
如果 Result(4)为 positive Infinity, return true
-
如果 Result(5)为 negative Infinity(-Infinity),return false
-
如果 Result(5)为 negative Infinity,return true
-
如果 Result(4)数值大小小于 Result(5),return true,否则 return false
-
如果 Result(2)是 Result(1) 的前缀 return false("ab"是"abc"的前缀)
-
如果 Result(1)是 Result(2)前缀 return true
-
找到一个位置 K,使得 a[k]与 b[k]不相等
-
取 m 为 a[k]字符的数值
-
取 n 为 b[k]字符的数值
-
如果 m< n, return true, 否则 return false
// 部分伪码 const Result1 = { [Symbol.toPrimitive](hint) { if(hint == 'number') return new Number(hint) } } if(Result1 instanceof String) goto step16
-
所以 null > 0 false
-
a == b
表现, 三等号严格判断类型和值, 但是双等号反而是最复杂的情况-
如果 a 与 b 类型相同, 则
-
if typeof b == 'undefined' return true
-
if typeof b == 'null' return true
-
if (typeof b == 'number') { if(Number.isNaN(b)) return false if(Number.isNaN(a)) return false if(Number(a) == Number(b)) return true // 伪码来了,正0负0我不会写。。。 if(a == 'positive zero' && b =='negative zero') return true if(a == 'negative zero' && b == 'positive zero') return false else return false }
-
if typeof b == 'string' && a === b . return true, else return false
-
typeof b == 'boolean' a && b true/false, return ture. else return false
-
if a && b is reference of the same object, return true, else return false
-
-
如果 a 为 null,b 为 undefined,return true
-
如果 a 为 undefined, b 为 null, return true
-
如果 Type(a)为 number,Type(b)为 string ,返回 a == ToNumber(b)的结果
-
如果 Type(a)为 string,Type(b)为 number,返回 toString(a) == b 的结果
-
如果 Type(a)为 boolean,返回 toNumber(a) == b 的结果
-
如果 Type(b)为 boolean,返回 a == ToNumber(b)的结果
-
如果 Type(a)是 string 或 number,且 Type(b)是对象类型,返回 a == ToPrimitive(b)的结果
-
如果 Type(a)是对象类型,b 是 String 或者 number,返回 ToPrimitive(a) == b 的结果
-
否则 return false
null == 0 走到了第十步,返回默认的 false
-
- 如果 a < b 为 false, 则 a >= b 为 true
- null >= 0 为 true,是因为 null < 0 为 false
-
通过
Symbol.toPrimitive
定义某个 class 的 ToPrimitive 行为:class AnswerToLifeAndUniverseAndEverything { [Symbol.toPrimitive](hint) { if(hint == 'string') { return 'Like 42, man'; } else if(hint === 'number') { return 42; } else { // when pushed, most classes (except Date) // default returning a number primitive return 42 } } }
- NaN 是 JS 的一个特殊存在,是有
isNaN
才能准确判断到,使用比较判断的时候直接返回 false - JS 隐式转换有一套优先级规则,不同值隐式转换还需要对表记忆
- 推荐比较判断的时候,尽量使用
===
通过 TS Flow 强类型语言约束变量类型,尽量不要做不同类型之间变量比较,隐式转换混淆代码理解和值比较