为什么Number([])为0,而Number(![])也为0?

时间:2018-09-07 07:39:33

标签: javascript

我正在深入研究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)

以上三个输出使我发疯,因为我不了解那里发生的事情。谁能解释一下幕后发生的事情?

3 个答案:

答案 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)

如果您尝试通过控制台记录两个值,您会看到

  • []作为一个空数组出现,它具有一个toString方法,该方法返回“”,并通过Number()转换为零。
  • ![]显示为假,也将转换为零