基本上全部的语言都有 隐式类型转换
,可是对于 弱类型语言(JS)
来讲 ,隐式类型转换会比 强类型语言(Java)
带来更大的反作用,有些行为甚至是难以想象的。虽然你可能很惊讶 ,甚至可能怀疑是 JS 的 BUG,可是这都是有 JS 语言本身的一个隐式类型转换的套路。设计
这个其实咱们使用的最多,例如 "10" + 1
结果返回的是 101
而不是 11,这就是String
类型的隐式转换。code
在+号的左右侧,只要又有一个或者两个操做数是字符串则作拼接操做
可是其实这句话并不彻底对,例如[1,2] + [3,4]
这种也会发生字符串拼接,至于为何会拼接,我后面会提到,这里就先卖个关子。ip
还有 if、while等
表达式里面会将值强行转换成Boolean
,-
运算符会将左右两边换成 Number
字符串
这些都是基本类型的隐式转换,因为都比较熟了,加上例子太多我就不一一写出来了it
上面提到的都是基本类型和基本类型的隐式转换,那么复杂类型是如何进行隐式转换的呢?class
复杂类型的转换会把自身变成基本类型,其方法就是调用 ToPrimitive
,实际上就是去尝试使用 valueOf()
和toString()
获取一个基本类型,优先使用 valueOf
若是没法获取到基本类型,则使用 toString
。若是二者都没有获取到基本类型,他会抛出一个 Cannot convert object to primitive value
错误.object
如今咱们看回上面提到的 [1,2] + [3,4]
实际上就是 "1,2" + "3,4"
结果天然等于 1,23,4
引用
在开始讲解 相等比较的隐式类型转换
的以前,我写几个行代码,你们看看下面这些代码会打出什么类型.方法
false == ""; true == "why?"; false == "0"; "" == 0; [] == 0; [] == false; [] == ![]; [] == ""; [1,2,3] == "123"; [1,2,3] == "1,2,3"; let a = null,b; a == b; a == false; b == false; a == ""; b == ""; a == 0; b == 0;
你们能够执行一下代码,看看结果是否是与你预期的同样。我估计能答对的人不会不少。我用一个一个案例来说明 JS的隐式类型转换
im
假设 X 是
Number
类型,Y 是其余类型,则 X == Y 其实是 X == Number(Y)
显示转化Number的时候,""和空格会被转换为0
"" == 0 ----> Number("") == 0 ----> 0 == 0
首先咱们要明白 Boolean
中 true
和 false
的概念是什么
false
的取值范围是 undefined、null、false、+0、-0、 NaN、""。true
的取值范围为 除了false
意外的全部 状况
而后就是在 Boolean
和其余类型相等比较 的时候,会遵循下面的一条规则
假设 X 是
Boolean
类型,Y 是其余类型,则 X == Y 其实是 Number(X) == Y
咱们按着这个规则去看上面的实例
false == "" ----> 0 == ""
而刚刚咱们在上面说过 0 == ""
结果为 true
true == "why?" ----> 0 == "why?" ----> 0 == Number("why?") ----> 0 == NaN
结果为 false
至于 false == "0"
我就不解释了,同样的转换逻辑
undefined
和 null
在相等的对比中是比较特别的,JS 规范中
在相等比较中 null 和 undefined 是同一个概念 也就是 null == undefined 为 true,除此以外他与任何东西都不想等
let a = null,b; a == b; //true //下面这些所有返回false a == 0; b == 0; a == ""; b == ""; a == false; b == false;
复杂类型的想等比较涉及上面讲的ToPrimitive
,其规则就是
假设 X 是
复杂类型
类型,Y 是其余类型,则 X == Y 其实是 ToPrimitive(X) == Y
[] == 0; // "" == 0 [] == false; // "" == false [] == ""; // "" == "" [] == ![] // [] == false [1,2,3] == "123"; // "1,2,3" == "123" [1,2,3] == "1,2,3"; // "1,2,3" == "1,2,3"
NaN
与自身不想等NaN
与自身不想等是 JS
一直以来的规范,至于有啥设计缘由,我暂时不清楚,有了解的读者能够告诉我下
本书引用了一些<<你不知道的JavaScript(2)>>的内容,有兴趣的能够买来看一下,物超所值