2016-10-10 4 views
3

いつものように同じですが、私は以下の見つけ以下のように書くことができますは、== Bいくつかの古いコードをリファクタリング= B

someVar != otherVar 

ロジックがそうするようです。しかし、これはJavascriptなので、私は担保の問題を恐れているので、これは本当に大丈夫ですか?

+2

これらの変数の値のタイプ/範囲は何ですか? – Amit

+0

@Amit通常はブール値ですが、必ずしもそうとは限らないので、私は尋ねています。彼らが文字列か何か違うと想像してみてください。 – lucasarruda

+1

'someVar!= otherVar'は'!(someVar == otherVar) 'と等価ですが、その他は' otherVar'に依存します。 – Bergi

答えて

5

実際には、それらのステートメントは非常に異なっています。 !aVarは、そのvarをブール値に強制します。例えば'!0' = true、'!1'または他の数字はすべてfalseになります。 その他の例!'' = true !'abc = false。

!=は、タイプ変換に応じて非常に異なる結果をもたらす可能性がある寛大な(in)等価比較を行います。

5 != 6 //true 
5 == !6 //false -> !6 is forced to a boolean (6=true,!6 = false), for the comparisson 5 is cast to a boolean (true), so the comparisson nets false 
5 != 5 //false 
5 == !5 //false, but because the same reason as above !5 becomes true, etc. 

は、おそらくあなたが言及した古いコードは正確にotherVarをboolifyingの理由のためにこれを使用しています。 someVarがすでにブール値である場合は、そうすることが理にかなっています。それ以外の場合はおそらく間違った結果になるでしょう。

+0

私の恐怖は、varをキャスト/ブーファイリングする何らかの処理を行っていたことを正確に示していました。その場合、リファクタリングによってバグを導入する可能性があります。明確にしてくれてありがとう! – lucasarruda

6

答えはなしです。

Infinity == !NaN; // false 
Infinity != NaN; // true 

'abc' == !false; //false 
'abc' != false; // true 

コンソールを開いて自分で確認してください。もっと多くの例があります。

+1

スニペットを使用してください - 人々に "自分自身をチェックする"ように指示するのは悪い習慣です。 – Amit

+0

あなたは@Azamantesを手に入れました!たぶんエッジケースですが、間違いなく起こる可能性があります。 – lucasarruda

+1

また、 '{}!= null'か' []!= null'か 'null!= false'、' 1!= Infinity'などについてはどうでしょうか? – adeneo

関連する問題