2016-12-22 2 views
0

次かのように見えます:なぜ論理積と間違ってスローとリターンを使用していますか?

err && throw err; 

は有効なJSではありません。なぜこれはそうですか?私のIDE(WebStorm)は言う:

発現は、私はまた、次の程度興味の割り当てではありませんか

を呼び出す:

err && return err; 

上記は私にも有効ではありません知識、私はなぜそれがあるのだろうと思っています。

+0

AFAIK throwには戻り値がないため、そのような式では使用できません。 –

+1

'throw'と' return'はステートメントです。 expressionとstatementのオペランドに論理演算子を使用することはできません... 'return err'という文は何も評価されないため、使用できません。 – Li357

答えて

5

式と文の違いを理解する必要があります。

JavaScriptでは、ステートメントは何かを行うものです。たとえば、条件をチェックするステートメントif、ループして繰り返すステートメントforなどがあります。この場合、throwreturnは、特定のタスクを実行するためにエラーとみなされたり、実行者と値を呼び出し元に返したりするため、ステートメントと見なされます。 (詳細は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を見てみましょう:

演算子:論理AND(&&

使い方を:expr && expr

説明:falseに変換できる場合はexpr1を返します。それ以外の場合はexpr2を返します。したがって、ブール値で使用された場合、& &は両方のオペランドが真である場合に真を返します。それ以外の場合はfalseを返します。

あなたが見ることができるように、論理AND値となるために評価2つの表現が、その後に操作するブール値に変換し期待しています。あなたの例では、前述のようにreturnthrowはステートメントです。つまり、それらはオペランドとして使用されません。 WebStormは式を期待しているため、「式は代入や呼び出しではありません」というエラーが発生しますが、それは取得したものではありません。

仕様では、これは機能しませんが、論理的には自分のコードについて考えてください。err && return err - と&&の説明を見て:

返しexpr1をfalseに変換できる場合。それ以外の場合はexpr2を返します。 errをtrueに変換されるとしたら

は、return errまたはthrow errはに何を評価されるでしょうか?ステートメントがなので、にはなりません。したがって、&&はステートメントでは機能しません。


あなたが望むものに応じて、次を試すことができます。

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

、それが定義されている場合、これはerrを返すかスローされます。 errのタイプがでない場合は、が未定義の場合は、それを返すか、またはスローします。

+2

大きな説明! –

関連する問題