文章目录

本文中的简单基本类型指的是除了 object 的基本类型

对于这个问题,首先我们需要知道,在 JavaScript 中对两个操作数进行加法操作会发生什么。

总的来说有以下几种情况:

  1. 当加号两边都是非字符串以及非对象的操作数时,进行数字相加。比如 true + null === 1。
  2. 当加号两边有一方或两方都是字符串时,执行字符串的连接。比如 1 + “2” === “12”。
  3. 当加号两边有一方或两方为对象时,先对对象进行拆箱操作,然后用拆箱后得到的简单基本类型作为操作数。

标题中的表达式其实是对于第三条规则的应用,当执行代码 4 + [1] 时,会先对 [1] 进行拆箱操作。这个拆箱操作就是调用 [1] 的隐藏函数 [[ToPrimitive]] ,然后得到简单基本类型。

数组的 ToPrimitive 函数执行时会先调用对象的 valueOf 方法,如果没有得到简单基本类型再调用对象的 toString 方法。

我们可以直接使用 [1].valueOf() 和 [1].toString() 查看结果。最终我们发现 valueOf 的结果是一个数组,toString 的结果是一个字符串 “1”。所以 [1] 拆箱的最终结果是 “1”。

标题中的 4 + [1] 相当于 4 + “1” ,结果为 “41”。

其实在这个问题中,我们还可以知道为什么没有元素或有一个元素的数组可以转换为数字。

  • Number([]) : 空数组拆箱后得到空字符串,空字符串可以转换为数字 0。
  • Number([1]): 数组拆箱后得到字符串 “1”,这个字符串转换为数字为 1。
  • Number([1,2]): 数组拆箱后得到字符串 “1,2” ,Number(“1,2”) 结果为 NaN。

Number 用来执行类型转换,也可以用 +”string” 的方法来执行转换。

Goran Ivos  2017-04-25 07-26-20 .jpg

文章目录