答案是字符串'0'。运算过程如下: JS中,加法运算只在基本数据类型进行。[]是object类型,需进行数据类型转换,先调用valueOf()函数,返回集合自身[],依然不是基本数据类型,继续调用toString()函数,返回''。0 + '' = '0'
0 + [] =
0 + [].valueOf() = // valueOf() 返回[]
0 + [].toString() = // toString() 返回''
0 + '' = '0'
JavaScript的加法运算规则:
- 只有基本数据类型进行加法运算
- 非基本数据类型自动转换成基本数据类型后参与运算
- 如果某个参与运算的值类型转换后为字符串,运算变成字符串连接运算,最终结果为字符串
- 如果没有出现字符串,所有值转换成number类型进行计算,number的基数是10(十进制)
- 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, 八进制