演算子の優先順位のJavascriptを利用した三元系オペレーター
質問
と思う私のラップヘッド周辺のこのコード(+=)と組み合わせは、複ります。
h.className += h.className ? ' error' : 'error'
のだと思いこのコードは、以下のことが明らかとなった。
h.className = h.className + h.className ? ' error' : 'error'
も正確とはいえないので、エラマソフトである。
その後、私の質問はいつ、どのようにinterpetこのコードを確認してください。◆
解決
h.className = h.className + (h.className ? ' error' : 'error')
あなたはそれについて具体的に良く、h.className
のための仕事にオペレーターをしたい。
もちろん、害がh.className += ' error'
から来るべきではありませんが、それはまた別の問題だ。
+
は三項演算子に優先を持っていることをまた、ノートJavaScriptの演算子の優先順位
の他のヒント
この目的:
<variable> = <expression> ? <true clause> : <false clause>
の算が実行では、原則として下記の通りです:
- は
<expression>
評価はtrue、評価す。 - の場合
<expression>
きの評価がtrueの値<true clause>
が割り当てられ<variable>
,<false clause>
は無視され、次の算が実行されます。 - の場合
<expression>
評価値が偽の場合に、その<true clause>
は無視され、価値の<false clause>
が割り当てられ<variable>
.
重要なことを実現させると、複このオペレーター及びその他の言語は何でコードが <expression>
をもたらすbooleanが発生した場合の結果を評価:はtrueまたはfalseです。
の場合の例でき換えて付"私の説明"追加"、または類似のいずれかの短縮形演算を使用する場合.
+=
は、それが未定義れた場合、それは次のようになりfalsey、ある場合は、 h.className
は何をしたいんが、それの右側にある三元の文では、それをチェックします。それのtruthyは(クラス名がすでに指定され、即ち場合)、エラーが(つまりの新しいのクラスを追加)スペースで追加され、それ以外の場合は、スペースなしで追加されます場合。
あなたが示唆ようなコードを書き換えることができますが、あなたはh.className
は三項演算子で、truthiness-比較のためではなく、その実際の値を使用するために使用されることを指定する必要があるので、必ずと気にしない作りますあなたの三項演算を行うと同時に、値の連結ます:
h.className = h.className + (h.className ? ' error' : 'error');
=
演算子の右側には、左から右に評価されます。だから、
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');
if (h.className) {
h.className = h.className + ' error';
} else {
h.className = h.className + 'error';
}
と同等でなければなりません
h.className += h.className ? ' error' : 'error';
私は、これは非常に古い質問ですけど、彼らはすべての不完全に見えるように私は答えのいずれかと、100%満足していません。そこでここでは、最初のプリンシパルから再度行くます:
ユーザーの全体的な目的:
のコードをまとめると:が「私は、文字列内のクラス名がすでに存在する場合、必要に応じて先頭のスペースで、文字列にerror
クラス名を追加したい」の
最も簡単な解決策
としてコビは最短正しい解決策が実際になるように、クラス名に先頭のスペースは、任意の既知のブラウザには問題はありません持つ、5年前に、指摘しました
h.className += ' error';
それはされている必要があります。の実際の答えから実際の問題の
<時間>、質問を尋ね、それが得るような...
あったとして1)なぜこの作品?
h.className += h.className ? ' error' : 'error'
条件/三元if文のようなオペレータの動作、変数にそのtrue
又はfalse
パスの割り当て結果
if (h.className IS NOT null AND IS NOT undefined AND IS NOT '')
h.className += ' error'
else
h.className += 'error'
2)と、このブレークをした理由は?
h.className = h.className + h.className ? ' error' : 'error'
コードの関数のない思考にあなたを欺くことがあり、「私のコンソールの[n]はエラーになります」質問状態。実際には、次のコードは、は文字列の場合は、のエラーのせずに、実行されますが、それは単にリターン「エラー」んの空に「エラー」の文字列の場合、のたではなかったですの空とそうが要件を満たしていませんでした。の
このコードは、常にそれが、この擬似コードに評価されるためだけ' error'
または'error'
を含む文字列になります:
if ((h.className + h.className) IS NOT null AND IS NOT undefined AND IS NOT '')
h.className = ' error'
else
h.className = 'error'
は、この理由は、加算演算子(庶民に+
)は条件/三オペレータ(15)よりも高い「優先順位」(6)を有することです。 の私は数字がの
優先順位単に言語のオペレータの各種類は、特定の所定の順序(ちょうど左から右ではない)で評価されることを意味する。
参考:のJavascript演算子の優先順位の
はどのように評価の順序を変更するには:
今、私たちはそれが失敗した理由を知っている、あなたはそれを動作させる方法を知っておく必要があります。
他のいくつかの答えはについて話の優先度を変更するのが、のことはできません。の。優先順位は、言語にハードワイヤードされます。それはしかし、あなたはの評価の順序 ...
を変更することができます...ちょうどルールの固定セットですは評価の順序を変更することができ、当社のツールボックスのツールは(カッコ別名)のグループ化演算子です。それが評価されている括弧内の式を確保することによってこれを行うのの前に括弧外の操作。それは彼らがすべてですが、それは十分です。
彼らは(演算子をグループ化する)ので、ブラケットを持っているだけで動作し、の他のすべての演算子よりも高い優先順位の( "レベル0が今そこにある")。
:単にあなたは、条件付きテストは、単純な文字列連結の前に、最初に実行されることを保証するために、評価の順序のを変更するブラケットを追加することで、
h.className = h.className + (h.className ? ' error' : 'error')
の私は今、他の人の間で目に見えない錆びこの答えを残します。)の
いち説明のウェイン:
<variable> = <expression> ? <true clause> : <false clause>
き方や考え方の例:
case 1:
h.className += h.className ? 'true' : 'false'
- 代入演算子の動作および値が付加され
- 時運行のためのo/p:false
- 2時間。o/p:falsetrue--値を常に追加
case2:hです。クラス名=hです。className+hです。className?true:'false'
- その結果、などの場合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
=>と表現三元系オペレーターとしてternaryオペレーターは高いが優先されるものとします。なので、常に結果を元表現が割り当て
を定義する必要があり優先順位を使用ブラケット
を定義する必要があり順で評価すると、ブラケットケース2として働く場合は1
h.className = h.className + (h.className ? ' error' : 'error')