28

この単純な JavaScript 代入ステートメントに対して予期しない結果が得られます。

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

代わりに t に 1 が割り当てられると予想していました。しても同じ結果

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

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

4

4 に答える 4

30

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

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

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

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

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

whereReturn (normal, empty, empty).は、コンソールに出力されるものではなく、JavaScript によって内部的に認識される型を指します。

参考文献:

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

于 2011-02-22T15:41:30.623 に答える
16

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

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

代入演算の戻り値は の値ではundefinedなく、 であると言えますt


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

@TJ Crowderが述べたように、値varの責任があるようです。undefinedしかし、それは使用してはいけないという意味ではありませんvar。あなたが書いたコードは 100% 正しいです。

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

于 2011-02-22T15:39:50.717 に答える
3

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

var t = (1 == 1) ? 1 : 0;
于 2011-02-22T15:42:47.253 に答える
1

このコードは正常に動作します:

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

ここで確認してください。1を示します。

于 2011-02-22T15:40:08.053 に答える