Skip to content

Latest commit

 

History

History
152 lines (89 loc) · 4.24 KB

25.精读null大于等于0?.md

File metadata and controls

152 lines (89 loc) · 4.24 KB

025.精读《null >= 0?》.md

  • 前面自己看过《你不知道的 JS》中册,这里正好可以复习一下

大于判断

  • JS 在判断 a > b,21 种判断方法

    1. 调用 b 的 ToPrimitive(hit number)

    2. 调用 a 的 ToPrimitive(hit number)

    3. 如果 Result(1)与 Result(2)都是字符串,跳转到 16 步

    4. 调用 ToNnumber(Result(1)):Result(4) b

    5. 调用 ToNumber(Result(2)): Result(5) a

    6. 如果 Result(4)为 NaN,return undefined

    7. 如果 Result(5)为 NaN,return undefined

    8. 如果 Result(4)和 Result(5)数字相同,return false

    9. 如果 Result(4)为+0,Result(5)为-0,return false

    10. 如果 Result(4)为-0,Result(5)为+0,return false

    11. 如果 Result(4)为 positive Infinity, return false

    12. 如果 Result(4)为 positive Infinity, return true

    13. 如果 Result(5)为 negative Infinity(-Infinity),return false

    14. 如果 Result(5)为 negative Infinity,return true

    15. 如果 Result(4)数值大小小于 Result(5),return true,否则 return false

    16. 如果 Result(2)是 Result(1) 的前缀 return false("ab"是"abc"的前缀)

    17. 如果 Result(1)是 Result(2)前缀 return true

    18. 找到一个位置 K,使得 a[k]与 b[k]不相等

    19. 取 m 为 a[k]字符的数值

    20. 取 n 为 b[k]字符的数值

    21. 如果 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 类型相同, 则

      1. if typeof b == 'undefined' return true

      2. if typeof b == 'null' return true

      3. 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
        }
      4. if typeof b == 'string' && a === b . return true, else return false

      5. typeof b == 'boolean' a && b true/false, return ture. else return false

      6. 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

about ToPrimitive(MDN)

  • 通过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
            }
        }
    }

summary

  • NaN 是 JS 的一个特殊存在,是有isNaN才能准确判断到,使用比较判断的时候直接返回 false
  • JS 隐式转换有一套优先级规则,不同值隐式转换还需要对表记忆
  • 推荐比较判断的时候,尽量使用 === 通过 TS Flow 强类型语言约束变量类型,尽量不要做不同类型之间变量比较,隐式转换混淆代码理解和值比较