为什么?
我们都知道{} === {}得到false,为什么{} >= {}得到true呢?
这里涉及到值类型转换的问题,Javascript中将值从一种类型转换为另一种类型通常称为类型转换(type casting),这是一种显式的类型转换,隐式的类型转换称为强制类型转换(coercion)。这样来区分比较容易
- 类型转换发生在静态编译时
var c = String(a)
- 隐式转换发生在运行时
var b = a + ''ES5规范中定义了一些抽象操作和转换规则,这里大概介绍一下
ToString
- null转换为- "null"
- undefined转换为- "unedefined"
- true转换为- "true"
- 对象通过 - Object.prtotype.toString()来进行转换- var a = [1,2,3]
- a.toString() //1,2,3
 - ToNumber
- true转换为- 1,- false转换为- 0
- undefined转换为- NaN
- null转换为- 0
- 字符串遵循数字常量的规则和语法,如果处理失败返回 - NaN- 如果是字符串中只包含数字(包括前面带正号或负号的情况),则将其转换为十进制数值,即“1”变成1,“123”会变成123,而“011”会变成11(前导的零被忽略了);
- 如果字符串中包含有效的浮点格式,如“1.1”,则将其转换为对应的浮点数值(同样也会忽略前导零);
- 如果字符串中包含有效的十六进制格式,例如”0xf”,则将其他转换为相同大小的十进制整数值;
- 如果字符串是空的(不包含任何字符),则将其转换为0;
- 如果字符串中包含除上述格式之外的字符,则将其他转换成NaN.- Number('') //0
- Number('abc') // NaN
 
 
- 对象会先被转换成基本类型,首先检查并调用 - valueOf()方法,如果没有返回基本类型。会继续检查并调用- toString()方法,如果这两个方法都不返回基本类型,则报错- Number([]) //0
- Number(['abc']) //NaN
- Number({}) // NaN
 - ToBoolean- 这里说几个要注意的 
- 封装对象返回真 - const a = new Boolean(false)
- Boolean(a) //true
- const b = new Number(0)
- Boolean(b) //true
 
- 看似假值,实际是真值 - const arr = []
- const obj = {}
- const fn = function () {}
- Boolean(arr) //true
- Boolean(obj) //true
- Boolean(fn) //true
 - 最后我们看下标题,根据规范 - a<=b会被处理为- b < a然后将结果反转,因为- {} < {}结果为- false,所以- {} >= {}结果为- true。 
 这有点违背常识,- >=解释为“大于等于”,可是在- Javascript中- >=会被解释为“不小于”,即- !(b < a )。
 
                         
                                

