2016-12-22 43 views
0

看來好像如下:爲什麼使用throw和return與邏輯AND錯誤?

err && throw err; 

是無效的JS。這是爲什麼?我的IDE(WebStorm)說:

表達不轉讓或致電

我也好奇了以下內容:

err && return err; 

上面還沒有有效的我知識,我想知道爲什麼會這樣。

+0

AFAIK throw沒有返回值,所以不能用於這種表達式。 –

+1

'throw'和'return'是語句。你不能在表達式和語句的操作數上使用邏輯運算符...'return err'不會計算任何東西,所以你不能使用它... – Li357

回答

5

你必須理解表達式和語句之間的區別。

在JavaScript中,語句是做某事的東西 - 例如:檢查條件的if語句或循環和迭代的for語句。在這種情況下,throwreturn被認爲是陳述,因爲它們做了一定的任務 - 拋出錯誤或返回執行和值給調用者。 (Further reading:ECMAScript 2015 Specification, Section 13 - Statements

另一方面,表達式評估爲一個值,並且可以在任何需要值的地方替換,例如1 + 2foo()。在這種情況下,err是一個表達式,因爲它的計算結果是一個值。 (進一步閱讀:ECMAScript 2015 Specification, Section A.2 - Expressions

表達式可代替語句(表達式語句)的使用,但逆是不正確的。 語句不能用於表達式。(延伸閱讀:Expressions versus statements in JavaScript


現在,我們已經得到了出路,看看the MDN documentation for logical operators

運營商:邏輯與(&&

用法:expr && expr

描述:返回expr1如果它可以轉換爲false;否則,返回expr2。因此,利用布爾值使用時,& &返回true,如果這兩個操作數都爲真;否則,返回false。

正如你可以看到,邏輯與需要兩個表達式,評價成爲值然後被轉換成布爾值要被操作上。現在在你的例子中,returnthrow,如前所述,是語句,這意味着它們不能被用作操作數。這會產生錯誤「表達式不是一個賦值或調用」 - 因爲WebStorm需要一個表達式,但它不是它得到的。

通過規範,這是有道理的,這是行不通的,但在邏輯想想你的代碼。err && return err - 並期待在描述爲&&

返回expr1是否可以轉換爲false;否則,返回expr2

如果err將被轉換爲true,你會return errthrow err進行評估,以?它不會對任何東西,因爲它是一個聲明,因此&&不適用於語句。


取決於你想要什麼,你可以嘗試以下方法:

if(typeof err !== "undefined") 
    return err; //or throw err; 

這將返回或拋出err如果它被定義。如果err的類型是而不是未定義,則返回或拋出它。

+2

很好的解釋! –