次かのように見えます:なぜ論理積と間違ってスローとリターンを使用していますか?
err && throw err;
は有効なJSではありません。なぜこれはそうですか?私のIDE(WebStorm)は言う:
発現は、私はまた、次の程度興味の割り当てではありませんか
を呼び出す:
err && return err;
上記は私にも有効ではありません知識、私はなぜそれがあるのだろうと思っています。
次かのように見えます:なぜ論理積と間違ってスローとリターンを使用していますか?
err && throw err;
は有効なJSではありません。なぜこれはそうですか?私のIDE(WebStorm)は言う:
発現は、私はまた、次の程度興味の割り当てではありませんか
を呼び出す:
err && return err;
上記は私にも有効ではありません知識、私はなぜそれがあるのだろうと思っています。
式と文の違いを理解する必要があります。
JavaScriptでは、ステートメントは何かを行うものです。たとえば、条件をチェックするステートメントif
、ループして繰り返すステートメントfor
などがあります。この場合、throw
とreturn
は、特定のタスクを実行するためにエラーとみなされたり、実行者と値を呼び出し元に返したりするため、ステートメントと見なされます。 (詳細は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を見てみましょう:
演算子:論理AND(
&&
)使い方を:
expr && expr
説明:falseに変換できる場合は
expr1
を返します。それ以外の場合はexpr2
を返します。したがって、ブール値で使用された場合、& &は両方のオペランドが真である場合に真を返します。それ以外の場合はfalseを返します。
あなたが見ることができるように、論理AND値となるために評価2つの表現が、その後に操作するブール値に変換し期待しています。あなたの例では、前述のように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'はステートメントです。 expressionとstatementのオペランドに論理演算子を使用することはできません... 'return err'という文は何も評価されないため、使用できません。 – Li357