2017-08-11 90 views
17

在Chrome JavaScript控制檯中,爲什麼將括號括起來的語句{} - 0更改返回的值?{} - 0 JavaScript中的VS({} - 0)

{} - 0 // Returns -0 
({} - 0) // Returns NaN 

在圓括號中包裝單個語句會改變包含的值,這似乎令人難以置信的奇怪。我在這裏錯過了什麼?

+0

好問題,當然還有別人比我知道得多。我猜想它與你將它包裝在paranthesis中的事實有關,這使得它成爲一個可執行的函數? – jdmdevdotnet

+2

https://www.destroyallsoftware.com/talks/wat –

+1

看起來像一個空的塊,vs空對象 – epascarello

回答

19

有線{} - 0的兩種可能的解釋:

  1. 它可以被解釋爲{}; -0,其中{}被解釋爲空塊語句,並且-是一元否定運算符(因此-0只是「負零」)。評估時的值是最後一條語句的值,即-0。
  2. 它可以解釋爲({} - 0),其中{}被解釋爲一個空的對象,並-是減法運算符(所以0{}減去)。

在您的第一行中,這是不明確的,所以它會選擇第一個解釋。在第二行中,第一個解釋是無效的(因爲塊聲明永遠不能成爲表達式的一部分,這是你用強調的方式強制的)。

+4

這是一個非常有趣的問題。不是OP,但我對此有了一個後續:如果通過添加方法或屬性強制將該{}解釋爲對象,會怎麼樣?這適用於括號,但並非沒有。 (例如帶括號的表達式被評估爲'3':'({valueOf:()=> 3} - 0)',但沒有,它仍然在控制檯中返回'-0':'{valueOf :() => 3} - 0')。不應該添加的方法強迫它將'{..}'解釋爲此時的對象,然後嘗試將其評估爲減法? –

+0

@JosephMarikle我認爲同樣的推理在這裏仍然適用,沒有parens,它仍然可以解釋爲'{valueOf:()=> 3}; -0'然而'({valueOf:()=> 3}; -0)'是一個語法錯誤。 –

+6

@JosephMarikle你會這樣想,但不:在這種情況下,'valueOf:'是一個[標籤語句](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/label )(一種罕見的JavaScript特性),在語句'()=> 3;'之前,所以它仍然被解釋爲一個塊語句而不是一個對象。它的解釋方式與'{valueOf:()=> 3; }; -0'。 – Frxstrem

4

{} - 0:這裏{}只是一個空白的塊,什麼都不做,所以-0由控制檯返回。

({} - 0):這裏{}是表達式的一部分,並被轉換爲數字。在該空對象中沒有定義valueOf()方法,並且在轉換爲數字時,它會回到toString()方法,該方法返回類似object Object{}。然後該字符串object Object正在轉換爲一個數字,並給出NaN,因爲它實際上不是一個數字。所以,我們有

({} - 1) - >('object Object' - 1) - >(NaN - 1)

的一切與NaNNaN。這就是你終於在控制檯中看到的。

2
{} - 0 

被解釋:{} empty block statement- 0 negative zero

({} - 0) 

所有內部()被解釋爲表達,empty object - 0 = NaN

相關問題