JavaScript的强制类型转换(二)

107 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 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

这里ab是都是字符串所以这里进行拼接操作。

如果其中一个操作数是对象(或数组),首先对其进行ToPrimitive操作,然后调用[[DefaultValue]]

var a = [1,2]
var b = [3,4]
a + b // "1,23,4"

这里ab是数组,需要将数组转换为字符串。调用[[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)