我正在深入研究JavaScript,并遇到了一些我想理解的棘手行为。这只是学习目的,所以如果有人知道,请解释一下幕后发生的事情。
请考虑以下输出,以了解我的担忧!
console.log(Number([])) // 0
console.log(Number([1])) // 1
上面的输出很有意义,因为[]
为空,它将转换为0,并且如果有值,那么它将转换为仅在第一个索引中保存的值。
console.log(Number(![])) // 0
console.log(Number(!0)) // 1 (not sure why)
console.log(Number([3,5])) // NaN (Not sure why)
以上三个输出使我发疯,因为我不了解那里发生的事情。谁能解释一下幕后发生的事情?
答案 0 :(得分:4)
在将非基本类型传递给构造函数时,将其强制为基本类型,然后转换为数字:
[3, 5] -> "3,5" -> NaN
[] -> "" -> 0
[1] -> "1" -> 1
在将否定运算符(!)应用于转换为布尔值的对象时。
!0 -> !false -> true -> 1
!1 -> !true -> false -> 0
![] -> !true -> false -> 0
答案 1 :(得分:4)
这是由于强制类型引起的,在这种情况下,显式和隐式都如此。
Number([])
在第一个示例中,在Array#toString()
上调用[]
方法,结果为""
。之后,将空字符串显式强制为数字,并且Number("")
为0。
Number([1])
在第二个示例中,只是最后Number("1")
发生了同样的事情。
Number(![])
在下面的示例中,您可以正常地看到将Array转换为空并将其转换为布尔值会导致true
,但是由于!
将强制转换为布尔值,因此会导致{{ 1}},然后将其显式强制为数字,使其变为0。在这里,从未使用false
方法。
toString()
下一个示例非常简单,Number(!0)
或NOT 0
就是!0
,当转换为数字时为1。
true
在最后一个示例中,打印出Number([3,5])
的结果,因为NaN
的结果是[3,5].toString()
,它不是数字。
答案 2 :(得分:0)
如果您尝试通过控制台记录两个值,您会看到