代码之家  ›  专栏  ›  技术社区  ›  Pavankumar Shukla

为什么数字([])是0和数字(![])也是0?

  •  3
  • Pavankumar Shukla  · 技术社区  · 7 年前

    我正在深入研究JavaScript,遇到了一些棘手的行为,我正试图理解这些行为。这只是学习的目的,所以如果有人知道的话,请解释一下幕后发生了什么。

    请考虑以下输出,以了解我关心的是什么!

    console.log(Number([])) // 0
    console.log(Number([1])) // 1
    

    上述输出的意义如下 []

    console.log(Number(![])) // 0
    console.log(Number(!0)) // 1 (not sure why)
    console.log(Number([3,5])) // NaN (Not sure why)
    

    以上三个输出让我抓狂,因为我不知道那里发生了什么。有人能解释一下引擎盖下面发生了什么吗?

    3 回复  |  直到 6 年前
        1
  •  4
  •   Luca Kiebel    6 年前

    这是由于类型强制,在本例中是显式和隐式的。

    Number([])
    

    在第一个例子中 Array#toString() [] ,导致 "" Number("") 是0。

    Number([1])
    

    在第二个例子中,同样的情况也在发生,只是 Number("1") 最后。

    Number(![])
    

    true ,但自从 ! false ,然后显式强制为数字,使其为0。这里,那个 toString() 方法从未使用过。

    Number(!0)
    

    NOT 0 ,或 !0 是的 ,转换为数字时为1。

    Number([3,5])
    

    在最后一个例子中 NaN [3,5].toString() 3,5 ,不是数字。

        2
  •  4
  •   Jonas Wilms    7 年前

    将非原语传递给构造函数时,它将强制为原语,然后强制为数字:

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

    应用求反运算符(!)转换成布尔值的东西。

     !0 -> !false -> true -> 1
     !1 -> !true -> false -> 0
    ![] -> !true -> false -> 0
    
        3
  •  0
  •   Nicholas James Bailey    7 年前

    • []以空数组的形式出现,它有一个返回“”的toString方法,该方法按数字()转换为零
    • ![]显示为false,也转换为零