在Chrome JavaScript控制檯中,爲什麼將括號括起來的語句{} - 0
更改返回的值?{} - 0 JavaScript中的VS({} - 0)
{} - 0 // Returns -0
({} - 0) // Returns NaN
在圓括號中包裝單個語句會改變包含的值,這似乎令人難以置信的奇怪。我在這裏錯過了什麼?
在Chrome JavaScript控制檯中,爲什麼將括號括起來的語句{} - 0
更改返回的值?{} - 0 JavaScript中的VS({} - 0)
{} - 0 // Returns -0
({} - 0) // Returns NaN
在圓括號中包裝單個語句會改變包含的值,這似乎令人難以置信的奇怪。我在這裏錯過了什麼?
有線{} - 0
的兩種可能的解釋:
{}; -0
,其中{}
被解釋爲空塊語句,並且-
是一元否定運算符(因此-0
只是「負零」)。評估時的值是最後一條語句的值,即-0。({} - 0)
,其中{}
被解釋爲一個空的對象,並-
是減法運算符(所以0
從{}
減去)。在您的第一行中,這是不明確的,所以它會選擇第一個解釋。在第二行中,第一個解釋是無效的(因爲塊聲明永遠不能成爲表達式的一部分,這是你用強調的方式強制的)。
這是一個非常有趣的問題。不是OP,但我對此有了一個後續:如果通過添加方法或屬性強制將該{}解釋爲對象,會怎麼樣?這適用於括號,但並非沒有。 (例如帶括號的表達式被評估爲'3':'({valueOf:()=> 3} - 0)',但沒有,它仍然在控制檯中返回'-0':'{valueOf :() => 3} - 0')。不應該添加的方法強迫它將'{..}'解釋爲此時的對象,然後嘗試將其評估爲減法? –
@JosephMarikle我認爲同樣的推理在這裏仍然適用,沒有parens,它仍然可以解釋爲'{valueOf:()=> 3}; -0'然而'({valueOf:()=> 3}; -0)'是一個語法錯誤。 –
@JosephMarikle你會這樣想,但不:在這種情況下,'valueOf:'是一個[標籤語句](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/label )(一種罕見的JavaScript特性),在語句'()=> 3;'之前,所以它仍然被解釋爲一個塊語句而不是一個對象。它的解釋方式與'{valueOf:()=> 3; }; -0'。 – Frxstrem
{} - 0
:這裏{}
只是一個空白的塊,什麼都不做,所以-0
由控制檯返回。
({} - 0)
:這裏{}
是表達式的一部分,並被轉換爲數字。在該空對象中沒有定義valueOf()
方法,並且在轉換爲數字時,它會回到toString()
方法,該方法返回類似object Object
的{}
。然後該字符串object Object
正在轉換爲一個數字,並給出NaN
,因爲它實際上不是一個數字。所以,我們有
({} - 1)
- >('object Object' - 1)
- >(NaN - 1)
的一切與NaN
給NaN
。這就是你終於在控制檯中看到的。
{} - 0
被解釋:{} empty block statement
和- 0 negative zero
({} - 0)
所有內部()
被解釋爲表達,empty object - 0 = NaN
好問題,當然還有別人比我知道得多。我猜想它與你將它包裝在paranthesis中的事實有關,這使得它成爲一個可執行的函數? – jdmdevdotnet
https://www.destroyallsoftware.com/talks/wat –
看起來像一個空的塊,vs空對象 – epascarello