54
alert("test: "+(1==2)?'hello':'world');

'world'1 は 2 と等しくないため、これが画面に表示されるはずです。

なぜそれは警告を発するの'hello'ですか?

4

5 に答える 5

91

操作を括弧で囲んでみてください

alert("test: "+ (1 == 2 ? 'hello' : 'world'));

デモ: http://jsfiddle.net/hunter/K3PKx/


これは何をしているのか:

alert("test: "+(1==2)?'hello':'world');

どの出力"test: " + (1==2)として評価していますかtrue'hello'

于 2012-10-11T20:22:01.503 に答える
18

提出された回答はどちらも正しいので、括弧を追加する必要があります。その理由について簡単に話そうと思いました。

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

連結の前に三項演算子を評価することをパーサーに伝えます。

于 2012-10-11T20:43:41.140 に答える
4

余分な括弧を追加する必要があります:

alert("test: " + ((1 == 2) ? "hello" : "world"));
于 2012-10-11T20:21:53.390 に答える