为什么?
我们都知道{} === {}得到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转换为0undefined转换为NaNnull转换为0字符串遵循数字常量的规则和语法,如果处理失败返回
NaN- 如果是字符串中只包含数字(包括前面带正号或负号的情况),则将其转换为十进制数值,即“1”变成1,“123”会变成123,而“011”会变成11(前导的零被忽略了);
- 如果字符串中包含有效的浮点格式,如“1.1”,则将其转换为对应的浮点数值(同样也会忽略前导零);
- 如果字符串中包含有效的十六进制格式,例如”0xf”,则将其他转换为相同大小的十进制整数值;
- 如果字符串是空的(不包含任何字符),则将其转换为0;
- 如果字符串中包含除上述格式之外的字符,则将其他转换成NaN.
Number('') //0Number('abc') // NaN
对象会先被转换成基本类型,首先检查并调用
valueOf()方法,如果没有返回基本类型。会继续检查并调用toString()方法,如果这两个方法都不返回基本类型,则报错Number([]) //0Number(['abc']) //NaNNumber({}) // NaN
ToBoolean
这里说几个要注意的
封装对象返回真
const a = new Boolean(false)Boolean(a) //trueconst b = new Number(0)Boolean(b) //true
看似假值,实际是真值
const arr = []const obj = {}const fn = function () {}Boolean(arr) //trueBoolean(obj) //trueBoolean(fn) //true
最后我们看下标题,根据规范
a<=b会被处理为b < a然后将结果反转,因为{} < {}结果为false,所以{} >= {}结果为true。
这有点违背常识,>=解释为“大于等于”,可是在Javascript中>=会被解释为“不小于”,即!(b < a )。
