为什么?

我们都知道{} === {}得到false,为什么{} >= {}得到true呢?
这里涉及到值类型转换的问题,Javascript中将值从一种类型转换为另一种类型通常称为类型转换(type casting),这是一种显式的类型转换,隐式的类型转换称为强制类型转换(coercion)。这样来区分比较容易

  • 类型转换发生在静态编译时

var c = String(a)

  • 隐式转换发生在运行时

var b = a + ''
ES5规范中定义了一些抽象操作和转换规则,这里大概介绍一下

ToString

  • null 转换为 "null"
  • undefined转换为"unedefined"
  • true转换为"true"
  • 对象通过Object.prtotype.toString()来进行转换

    1. var a = [1,2,3]
    2. a.toString() //1,2,3

    ToNumber

  • true转换为1false转换为0

  • undefined转换为NaN
  • null转换为0
  • 字符串遵循数字常量的规则和语法,如果处理失败返回NaN

    • 如果是字符串中只包含数字(包括前面带正号或负号的情况),则将其转换为十进制数值,即“1”变成1,“123”会变成123,而“011”会变成11(前导的零被忽略了);
    • 如果字符串中包含有效的浮点格式,如“1.1”,则将其转换为对应的浮点数值(同样也会忽略前导零);
    • 如果字符串中包含有效的十六进制格式,例如”0xf”,则将其他转换为相同大小的十进制整数值;
    • 如果字符串是空的(不包含任何字符),则将其转换为0;
    • 如果字符串中包含除上述格式之外的字符,则将其他转换成NaN.
      1. Number('') //0
      2. Number('abc') // NaN
  • 对象会先被转换成基本类型,首先检查并调用valueOf()方法,如果没有返回基本类型。会继续检查并调用toString()方法,如果这两个方法都不返回基本类型,则报错

    1. Number([]) //0
    2. Number(['abc']) //NaN
    3. Number({}) // NaN

    ToBoolean

    这里说几个要注意的

  • 封装对象返回真

    1. const a = new Boolean(false)
    2. Boolean(a) //true
    3. const b = new Number(0)
    4. Boolean(b) //true
  • 看似假值,实际是真值

    1. const arr = []
    2. const obj = {}
    3. const fn = function () {}
    4. Boolean(arr) //true
    5. Boolean(obj) //true
    6. Boolean(fn) //true

    最后我们看下标题,根据规范 a<=b会被处理为b < a然后将结果反转,因为{} < {}结果为false,所以{} >= {}结果为true
    image.png
    这有点违背常识,>=解释为“大于等于”,可是在Javascript>=会被解释为“不小于”,即 !(b < a )