泄密Number的数据类型转换

先考考你这几个题目

1
2
3
4
5
6
7
Number('前端精髓')
Number(null)
Number(undefined)
Number([])
Number([1])
Number([1, 2])
Number(Number(new Date()))

感觉还可以吗?

如果你理解Number函数的转换规则,那么应该很容易的,但是里面的转换规则还是挺多的,一不留神就出错,那就详细分析一下。

如果是把布尔值传递给Number函数,将会得到0和1。

1
2
3
4
Number(false)
// 0
Number(true)
// 1

如果是把null和undefined传递给Number函数,将会得到0和NaN。

1
2
3
4
Number(null)
// 0
Number(undefined)
// NaN

如果是把字符串传递给Number函数,那肯定是NaN。

1
2
Number('前端精髓')
// NaN

如果是对象{}传递给Number函数,那肯定是NaN了。

1
2
3
4
5
let obj = {}
obj.toString()
// "[object Object]"
Number("[object Object]")
// NaN

对象的转换规则其实是这样的:会调用对象的toString方法得到结果,然后再传入Number方法中。

对于数组的转换规则呢,你要先知道数组调用toString会发生什么情况?

1
2
3
4
5
6
[].toString()
// ''
[1].toString()
// '1'
[1,2].toString()
// '1,2'

然后我们再调用Number方法就可以了

1
2
3
4
5
6
Number('')
// 0
Number('1')
// 1
Number('1,2')
// NaN