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

3

我正在深入学习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)

上面的三个输出让我很困惑,我不知道发生了什么。有人能解释一下其中的原理吗?

寻找“强制转换”。 - Lazar Ljubenović
1
正如@LazarLjubenović所说,您可能想查看例如此帖子 - Thomas Darvik
3个回答

4

当向构造函数传递一个非原始值时,它会被强制转换为原始值,然后转换为数字:

 [3, 5] -> "3,5" -> NaN
 [] -> "" -> 0
 [1] -> "1" -> 1

当对被转换为布尔值的内容应用否定运算符(!)时。

 !0 -> !false -> true -> 1
 !1 -> !true -> false -> 0
![] -> !true -> false -> 0

那么在 ![] -> !"" -> true -> 1 的情况下,它是如何得到 0 的呢? - Pavankumar Shukla
@pavan 对象(包括数组)是真值。 - Jonas Wilms

4
这是由类型转换引起的,本例中既有显式的类型转换也有隐式的类型转换。
Number([])

在第一个例子中,[]调用了Array#toString()方法,结果为""。之后空字符串被显式地强制转换为数字,Number("")等于0。
Number([1])

在第二个例子中,同样的事情正在发生,只是在结尾处使用了Number("1")
Number(![])

在下面的示例中,您可以看到通常将空数组转换为布尔值会得到true的结果,但由于将强制类型转换为布尔值取反,这导致结果为false,然后显式强制将其转换为数字,使其成为0。在此示例中,toString()方法从未被使用。
Number(!0)

下面的例子非常简单,NOT 0或者!0就是true,将其转换成数字后是1。
Number([3,5])

在最后一个例子中,打印出了NaN,因为[3,5].toString()的结果是3,5,这不是一个数字。

0

如果你尝试将这两个值进行控制台日志输出,你会发现

  • [] 输出为空数组,它有一个 toString 方法返回 "",使用 Number() 转换为零
  • ![] 输出为 false,也会被转换为零

如何理解 ![] 为0。如果 [] 转换为0,那么在布尔值中 !0 为真,因此应该是1。对吗? - Pavankumar Shukla

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接