2016-07-29 4 views
12

に評価されます。は[] ==![]タイトル</p> <p><code>[] == ![]</code></p> <p>に与えられた式がtrueに評価される理由を私は知っているだろうliketo真

配列を文字列として比較することはできません。私はそれを得る。参照が異なるため

[] == []

場合はfalseと評価されます。しかし、我々は次の声明を持っています。

var arr = []; 
arr == arr // this evaluates to true simply because references are the same. 

A == Bがtrueを返すためには、AとBのいずれかが偽または真でなければなりません。 A ==!B真を返すためにAは真、Bは偽、またはその逆でもかまいませんが、この場合はAとBは同じ値なので、私はそれを得ません。

+6

この質問には何も問題はありません。それはdownvotesを値するしません。あなたが同意しない場合は、解説付きのコメントを残してください。 – Brad

+0

おそらくティムは再び鍵を落としたのだろうか? – Li357

+0

私はアイデアを持っていないなぜ誰もこれをdownvoteだろう。それはあまり明らかではありません。 +1にBradのステートメント – Tek

答えて

4

![]は、参考文献が真実であるため、falseと評価されます。 []は、数字(この場合は0)に変換することができ、これは偽です。したがって、条件は等しいとみなされます。あなたが===をした場合、それは間違いでしょう。

+2

'[]'は偽ではありません。 '[]'はオブジェクトです。あなたのブラウザでそれを試してください: 'if([])console.log( '偽でない')' –

+1

この回答は間違っています。 – Brad

+2

私はかなり確信しています[数字ではなく文字列に変換](http://www.ecma-international.org/ecma-262/5.1/#sec-11.9.3)。 – Quentin

-1

配列は、カスタムオブジェクトと比較できるjavascriptの特別なオブジェクトです。 でも型はオブジェクトです、[] instanceof Array == true;

ですので、var x = [];を使用してください。配列コンストラクタを呼び出すことと全く同じです。 JavaScriptのオブジェクトの2つのインスタンスを比較すると、同じメモリアドレスを共有しないため、falseが返されます。それはポインタの比較のようなものです。

+0

質問は2つの配列を比較することを求めていません。これは、配列をブール値と比較することに関するものです。 – Quentin

+0

uups ..私のせい – Wolfgang

6

基本的に、両方の型が同じでない場合、Javascriptは両方の辺をNumberに変換しようとします。そして、その場合、オブジェクトは、それは

=> []==![] 

=> []==false // Type conversion by the statement itself 

=> []==0 // To number of right operand 

=> ""==0 // To Primitive call for Array which will in this case convert to empty string 

=> 0==0 // To number call of "" which is 0 

=> true 

一つは、コンパイラの説明では、ここでのECMAScriptの説明を確認することができますになりますステップにより、この場合のステップで

だから、プリミティブ値に変換しようとしhttp://www.ecma-international.org/ecma-262/5.1/#sec-11.9.3

1

codementor.io

何が起きているかを理解する前に、JavaScriptで真実と偽の概念を理解する必要があります。 (論理NOT)演算子が動作します。 false, null, undefined, NaN, 0, '' and ""のような値は、偽とみなされます。 *true, {}, [], "foo" *などの他の値は真実とみなされます。 !一方、演算子はブール値に対してのみ定義されます。 !で操作すると、他のデータ型は自動的に対応するブール値に強制的に変換されます。オペレーター。 ここで、![]はfalseと評価され、比較は実際に'[] == false'になり、これは'true'と評価されます。 空の配列が真実であるので、それは偽ではないと思われますか? そうですが、double equal演算子は特定のルールの式を評価します。 オブジェクトをブール値と比較しようとしており、JavaScriptはオペランドを暗黙的にNumber型に変換します。2つの値は==を使用して比較されるたびにtrue since zero is equal to zero

1

に評価Number([]) is 0Number(false) is also 0は、、Javascriptを抽象等価比較アルゴリズムを実行します。ここで

enter image description here

、xは[]であり、yはあります![]。 はまた、

typeof([]) // "object" 
typeof(![]) // "boolean" 

Yがブール値であるので、xはオブジェクトであり、条件7が成立する最初のものである:

タイプ(y)がブールの場合、比較xの結果を返します== ToNumber(y)。

ToNumber(y)の値は?

Number(![]) // 0 

[]は真理値であるため、否定するとfalseになるためです。 [] == 0

typeof演算ので、(0)、 "数" である条件8は、現在保持している:

入力した場合(ナンバー(偽)が0

今、私たちは、比較が持っていますx)がObjectでType(y)がStringまたはNumberの場合、比較結果ToPrimitive(x)== yを返します。

ToPrimitve(x)はx.toString()と似ています。 「」== 0

は今、条件5が成り立つ:

を(x)の文字列とタイプ(Y)で入力した場合である私たちは、今の比較で直面ほとんど行わ

[].toString() // ”” - the empty string 

数値、 比較の結果を返します。ToNumber(x)== y。

ToNumber(“”) // 0 

最後に、両方のオペランドが1が成立同じタイプおよび条件を有します。私はあなたがここから取ることができると思う:)

Abstract Equality Comparisonの仕様について読む!

関連する問題

 関連する問題