携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第11天,点击查看活动详情
大家好!我是前端爬楼工程师🚹,一个野生程序员。好奇新技术,仰慕牛大佬。如果喜欢我的文章,可以关注➕点赞,为我注入能量,与我一同成长吧~
上篇文章讲的是类型转换的本质是通过ToString, ToNumber, ToBoolean内部使用的方法来实现的,今天我们来看看JavaScript的如何触发隐式强制类型转换。
几个隐式类型转换的例子:
1 == '1'
1 - +'1'
字符串和数字之间的转换
某个操作数是字符串,
+将进行拼接操作,否则执行数字加法。
var a = "42"
var b = "0"
var c = 42
var d = 0
a + b // "420"
c + d // 42
这里a和b是都是字符串所以这里进行拼接操作。
如果其中一个操作数是对象(或数组),首先对其进行
ToPrimitive操作,然后调用[[DefaultValue]]
var a = [1,2]
var b = [3,4]
a + b // "1,23,4"
这里a和b是数组,需要将数组转换为字符串。调用[[DefaultValue]]实际就是看有没有valueOf()并调用它,因为valueOf()操作无法得到基本类型,所以转而调用toString(),分别得到了"1,2"和"3,4",最后将它们拼接。
知道了以上规则之后,看看以下情况就很好解释了:
[] + {} // "[Object object]"
{} + [] // 0
第一种情况就是,首先将[]和{}分别转换 "" 和 "[Object object]",最后拼接成"[Object object]"
第二种情况: {}当作空的代码块, 将只是将[]转换成了"", +""发生隐式转换,将""变成了0
a+"" 和 String(a)的比较:
a+""属于隐式转换,根据ToPrimitive抽象操作规则,先进行valueOf(),然后toString()String(a)直接调用toString()
var a = {
valueOf() {return 42},
toString() {return 2}
}
a + "" // "42"
String(a) // "2"
字符串转数字
"3.14" - 0 // 3.14
[3] - [1] // 2 数组先toString() 转换字符串3 和1,然后转换为数字,得到2
为了执行减法(包括乘除)运算,这里需要将字符串转换成数字。
+则会拼接字符串(+一元运算可以转换数字)
隐式强制类型转换为布尔值
if(..)
for(..;..;..)
while(..) do..while(..)
.. ? .. : ..
|| &&
以上都是隐式强制类型转换的情况。
符号强制类型转换
String(Symbol('cool')) // "Symbol(cool)"
Symbol("cool") + "" // TypeError
符号类型转换为数字会产生错误,但可以转换为布尔值(true)