web-dev-qa-db-ja.com

Javascriptの三項演算子と割り当て

この単純なJavaScript割り当てステートメントで予期しない結果が得られます。

var t = 1 == 1 ? 1 : 0;
undefined

代わりに、vに1が割り当てられることを期待していました。あなたがするなら同じ結果

var t = (1 == 1 ? 1 : 0);
undefined

これが期待どおりに機能しない理由を誰かが説明できますか?

25
faridz

たとえば、Firebugコンソールで_var t = 1 == 1 ? 1 : 0;_を評価した結果は、undefinedになります。ただし、tの値は予想どおり_1_になります。割り当て後にtを出力してみてください。

Firebug will変数宣言が別の行にある場合に結果を出力します。

_var t;
t = 1 == 1 ? 1 : 0;
_

これは、代入演算の戻り値が代入される値だからです。ただし、varキーワードが存在する場合、返されるのはVariableStatement宣言の値であり、次のように動作します。

プロダクションVariableStatementvarVariableDeclarationList;次のように評価されます:Evaluate VariableDeclarationList。戻る(通常、空、空)。

ここで、Return (normal, empty, empty).は、JavaScriptによって内部的に認識される型を指し、コンソールに出力されるものではありません。

参考文献:

http://ecma262-5.com/ELS5_HTML.htm#Section_12.2

22
Wayne Burkett

それは完全に機能します:

> var t = 1 == 1 ? 1 : 0;
undefined
> t
1

割り当て操作の戻り値はundefinedであり、tの値ではないと言えます。


編集:しかし実際には 仕様を正しく読んだ場合 、式の値を返す必要があるようです。

@ T.JとしてCrowderは、varundefinedの値を担当しているようだと述べました。しかし、それはあなたがvarを使うべきではないという意味ではありません。あなたが書いたコードは100%正しいです。

これは言語の内部の仕組みに深く関わっていますが、それはあなたが興味を持っていることではないと思います。それについての詳細は、コメントをご覧ください。

12
Felix Kling

古いJavaScriptパーサーでは、括弧で条件を終了する必要があります。

var t = (1 == 1) ? 1 : 0;
3
Andrei

このコードは正常に機能します。

var t = 1 == 1 ? 1 : 0;
alert (t);

チェック ここ1と表示されます。

1
gor