117

三項演算子と組み合わせて、このコードの最初の部分 ( += ) に頭を悩ませているようには見えません。

h.className += h.className ? ' error' : 'error'

このコードが機能すると思う方法は次のとおりです。

h.className = h.className + h.className ? ' error' : 'error'

しかし、コンソールにエラーが表示されるため、それは正しくありません。

私の質問は、このコードを正しく解釈するにはどうすればよいですか?

4

7 に答える 7

141
h.className = h.className + (h.className ? ' error' : 'error')

オペレーターに のために働いてもらいたいので、h.className具体的に説明してください。
もちろん、害はありませんが h.className += ' error'、それは別の問題です。

+また、三項演算子よりも優先されることに注意してください: JavaScript Operator Precedence

于 2009-11-24T09:30:29.770 に答える
129

次のように考えてください。

<variable> = <expression> ? <true clause> : <false clause>

ステートメントが実行される方法は、基本的に次のとおりです。

  1. <expression>true と評価されますか、それとも false と評価されますか?
  2. <expression>が true と評価された場合、 の値が<true clause>に代入され<variable><false clause>は無視され、次のステートメントが実行されます。
  3. <expression>が false と評価された場合、<true clause>は無視され、 の値<false clause>が に割り当てられ<variable>ます。

この言語や他の言語で三項演算子を使用する際に重要なことは、コードが何であれ<expression>、評価されたときにブール値の結果 (true または false) を生成する必要があるということです。

あなたの例の場合、私の説明の「割り当て先」を「追加先」に置き換えるか、使用している省略形の算術演算があれば同様に置き換えてください。

于 2009-11-24T09:35:37.847 に答える
10

+=あなたが望むことをしますが、その右側の 3 項ステートメントでは、それh.classNameが偽であるかどうかをチェックします。これは、未定義の場合です。正しい場合 (つまり、クラス名が既に指定されている場合) は、エラーにスペースが追加されます (つまり、新しいクラスが追加されます)。それ以外の場合は、スペースなしで追加されます。

コードはあなたが示唆するように書き直すことができますがh.className、三項演算子で実際の値を使用するのではなく、真実性比較に使用することを指定する必要があるため、値の連結を気にしないでください。三項演算を行うと同時に:

h.className = h.className + (h.className ? ' error' : 'error');
于 2009-11-24T09:34:44.273 に答える
4

=演算子の右側は左から右に評価されます。そう、

g.className = h.className + h.className ? ' error' : 'error';`

と同等です

h.className = (h.className + h.className) ? ' error' : 'error';

に相当する

h.className += h.className ? ' error' : 'error';

三項ステートメントを括弧で区切る必要があります

h.className = h.className + (h.className ? ' error' : 'error');
于 2009-11-24T09:30:41.533 に答える
3
if (h.className) {
    h.className = h.className + ' error';
} else {
    h.className = h.className + 'error';
}

次と同等である必要があります。

h.className += h.className ? ' error' : 'error';
于 2009-11-24T09:34:58.930 に答える
1

ウェインの説明を選びたい:

<variable> = <expression> ? <true clause> : <false clause>

両方の場合を考えてみましょう。

case 1:
h.className += h.className ? 'true' : 'false'     
  • 代入演算子は正常に機能し、値が追加されます
  • 初めて実行するとき、o / p:false
  • 2回目。o / p:falsetrue-値は追加され続けます

case2:h.className = h.className + h.className?'真/偽'

  • 結果はケース1と同じではありません
  • 初めて実行するとき、o / p:false
  • 2回目。o / p:false-値が追加され続けない

explanation

上記のコードでは、ケース1は正常に機能します

一方、case2:

h.className = h.className + h.className ? 'true' : 'false'
is executed as 
 h.className = (h.className + h.className) ? 'true' : 'false'

h.className + h.className=>三項演算子が優先されるため、三項演算子の式と見なされます。したがって、常に3項式の結果が割り当てられます

角かっこを使用して優先順位を定義する必要があります

ケース2がケース1として機能するためには、括弧を使用して検討する評価の順序を定義する必要があります。

h.className = h.className + (h.className ? ' error' : 'error') 
于 2011-07-12T07:34:15.263 に答える