JavaScript: 0 + [] = ?

223 阅读2分钟

答案是字符串'0'。运算过程如下: JS中,加法运算只在基本数据类型进行。[]是object类型,需进行数据类型转换,先调用valueOf()函数,返回集合自身[],依然不是基本数据类型,继续调用toString()函数,返回''。0 + '' = '0'

0 + [] = 
0 + [].valueOf() = // valueOf() 返回[]
0 + [].toString() = // toString() 返回''
0 + '' = '0'

JavaScript的加法运算规则:

  1. 只有基本数据类型进行加法运算
  2. 非基本数据类型自动转换成基本数据类型后参与运算
  3. 如果某个参与运算的值类型转换后为字符串,运算变成字符串连接运算,最终结果为字符串
  4. 如果没有出现字符串,所有值转换成number类型进行计算,number的基数是10(十进制)
  5. object类型参与计算,需做类型转换,先调用valueOf()函数,如果返回值不是基本数据类型,继续调用toString()函数

数据转换成number一些注意的点:

Number(null) // 0
Number(undefined) // NaN
Number('') // 0
Number(' ') // 0
Number(true) // 1
Number(false) // 0
Number(010) // 8,0开头是8进制
1 + Number(010) // 9, 8进制转成十进制后运算
Number(0x10) // 16, 0x开头是十六进制

思考一下,+[] = ?

答案是数字0。这里注意:+并不是加法运算,而是一元加号运算符,作用是将紧跟其后的值转成number,作用与Number()类似。

+[] =
Number([]) =
Number([].valueOf()) = // valueOf() 返回[]
Number([].toString())= // toString() 返回''
Number('') = 0

一元加号运算符支持整数、浮点数、十进制、八进制、十六进制、正数、负数。与Java的一元加号作用不同,JS的+无法将负数转成正数。

const x = 1;
const y = -1;
+x // 1
+y // -1
+'-1' // -1
+true // 1
+false // 0
+null // 0
+undefined // NaN
+Ox10 // 16, 十六进制
+'0x11' // 17, 十六进制
+'-0x11' // NaN
+0x11 // 17, 十六进制

+010 // 8, 八进制