alert("test: "+(1==2)?'hello':'world');
'world'
1 は 2 と等しくないため、これが画面に表示されるはずです。
なぜそれは警告を発するの'hello'
ですか?
alert("test: "+(1==2)?'hello':'world');
'world'
1 は 2 と等しくないため、これが画面に表示されるはずです。
なぜそれは警告を発するの'hello'
ですか?
操作を括弧で囲んでみてください
alert("test: "+ (1 == 2 ? 'hello' : 'world'));
デモ: http://jsfiddle.net/hunter/K3PKx/
これは何をしているのか:
alert("test: "+(1==2)?'hello':'world');
どの出力"test: " + (1==2)
として評価していますかtrue
'hello'
提出された回答はどちらも正しいので、括弧を追加する必要があります。その理由について簡単に話そうと思いました。
alert("test: "+(1==2)?'hello':'world');
パーサーがステートメントに遭遇すると、それを再帰的に小さなチャンクに分割し始めます。
この場合、最初に遭遇するのは関数です: alert
. パーサーはすぐに の引数を調べ、alert
それぞれの引数を個別に解析し始めます。この関数には 1 つの引数しかない"test: "+(1==2)?'hello':'world'
ため、最初のステップは簡単です。
このレベルでは、ステートメントを一連のバイナリ比較に分解できます。Javascript パーサーは、左から右にバイナリ ペアを形成します (操作値の順序が同じ場合)。私たちの潜在的な候補は、、、"test: "
および演算子付きの、(1==2)
およびです。パーサーは最初にandを追加しようとします。これを行うには、最初にステートメントを評価する必要があります(これは に評価されます)。この演算子は、文字列との連結を引き起こし、すべてのプリミティブ変数も文字列として表現しようとします。 statement を作成する文字列として評価されます。'hello'
'world'
+
?
:
"test: "
(1==2)
(1==2)
false
+
false
"false"
"test: false"
これで、パーサーは 3 項の最初の部分を評価する準備が整いました: "test: false"?
。Javascript では、空でないすべての文字列が に評価されtrue
、三項演算子のテストに合格し、最初のオプションが選択されます"hello"
。
元のステートメントにいくつかの追加の括弧を挿入することにより:
alert("test: " + ((1 == 2) ? 'hello' : 'world'));
連結の前に三項演算子を評価することをパーサーに伝えます。
余分な括弧を追加する必要があります:
alert("test: " + ((1 == 2) ? "hello" : "world"));