看來好像如下:爲什麼使用throw和return與邏輯AND錯誤?
err && throw err;
是無效的JS。這是爲什麼?我的IDE(WebStorm)說:
表達不轉讓或致電
我也好奇了以下內容:
err && return err;
上面還沒有有效的我知識,我想知道爲什麼會這樣。
看來好像如下:爲什麼使用throw和return與邏輯AND錯誤?
err && throw err;
是無效的JS。這是爲什麼?我的IDE(WebStorm)說:
表達不轉讓或致電
我也好奇了以下內容:
err && return err;
上面還沒有有效的我知識,我想知道爲什麼會這樣。
你必須理解表達式和語句之間的區別。
在JavaScript中,語句是做某事的東西 - 例如:檢查條件的if
語句或循環和迭代的for
語句。在這種情況下,throw
和return
被認爲是陳述,因爲它們做了一定的任務 - 拋出錯誤或返回執行和值給調用者。 (Further reading:ECMAScript 2015 Specification, Section 13 - Statements)
另一方面,表達式評估爲一個值,並且可以在任何需要值的地方替換,例如1 + 2
或foo()
。在這種情況下,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。
正如你可以看到,邏輯與需要兩個表達式,評價成爲值然後被轉換成布爾值要被操作上。現在在你的例子中,return
和throw
,如前所述,是語句,這意味着它們不能被用作操作數。這會產生錯誤「表達式不是一個賦值或調用」 - 因爲WebStorm需要一個表達式,但它不是它得到的。
通過規範,這是有道理的,這是行不通的,但在邏輯想想你的代碼。err && return err
- 並期待在描述爲&&
:
返回
expr1
是否可以轉換爲false;否則,返回expr2
。
如果err
將被轉換爲true,你會return err
或throw err
進行評估,以?它不會對任何東西,因爲它是一個聲明,因此&&
不適用於語句。
取決於你想要什麼,你可以嘗試以下方法:
if(typeof err !== "undefined")
return err; //or throw err;
這將返回或拋出err
如果它被定義。如果err
的類型是而不是未定義,則返回或拋出它。
很好的解釋! –
AFAIK throw沒有返回值,所以不能用於這種表達式。 –
'throw'和'return'是語句。你不能在表達式和語句的操作數上使用邏輯運算符...'return err'不會計算任何東西,所以你不能使用它... – Li357