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"));