为什么?
我们都知道{} === {}
得到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 )
。