2016-07-29 40 views
12

Ich würde liketo, warum der Ausdruck im Titel angegebenen[] == [] den Wert true

[] == ![]

auf true ausgewertet wird.

Sie können Arrays nicht als Zeichenfolgen vergleichen. Ich verstehe das. Wenn

[] == []

wird falsch bewerten, da die Referenzen unterschiedlich sind. Obwohl, wenn wir die folgende Aussage haben.

Um A == B zurückzugeben, müssen entweder A und B falsch oder wahr sein. A ==! B, um wahr zurückzugeben A kann wahr sein und B kann falsch sein oder umgekehrt, aber in diesem Fall sind A und B die gleichen Werte, so dass ich es nicht verstehe.

+6

Es ist nichts falsch mit dieser Frage. Es verdient keine Downvotes. Wenn Sie nicht zustimmen, sollten Sie einen Kommentar mit einer Erklärung hinterlassen. – Brad

+0

Vielleicht ließ Tim seine Schlüssel wieder fallen? – Li357

+0

Ich habe keine Idee, warum sollte jemand dies abwerten. Es ist nicht sehr offensichtlich. +1 zu Brads Aussage – Tek

Antwort

4

![] wertet false aus, weil die Referenz truthy ist. [] kann in eine Zahl (0 in diesem Fall) umgewandelt werden, die falsch ist. Deshalb: Die Bedingung wird als gleich übergeben. Wenn Sie === getan hätten, wäre es falsch.

+2

'[]' ist nicht falsch. '[]' ist ein Objekt. Probieren Sie es in Ihrem Browser aus: 'if ([]) console.log ('not falsey')' –

+1

Diese Antwort ist falsch. – Brad

+2

Ich bin mir ziemlich sicher [es konvertiert zu einer Zahl, keine Zeichenfolge] (http://www.ecma-international.org/ecma-262/5.1/#sec-11.9.3). – Quentin

-1

Ein Array ist ein spezielles Objekt in JavaScript, das mit benutzerdefinierten Objekten verglichen werden kann. Sogar der Typ ist Objekte, [] instanceof Array == true;

so mit var x = []; ist ziemlich gleich, als einen Array-Konstruktor aufzurufen. Und beim Vergleich von zwei Instanzen von Objekten in Javascript wird false zurückgegeben, da sie nicht dieselbe Speicheradresse haben. Es ist wie ein Zeigervergleich.

+0

Die Frage fragt nicht zum Vergleich zweier Arrays. Es geht darum, ein Array mit einem booleschen zu vergleichen. – Quentin

+0

Ups .. meine Schuld – Wolfgang

6

Grundsätzlich versucht Javascript beide Seiten in Zahl umzuwandeln, wenn beide Typen nicht gleich sind. Und wenn ihr ein Objekt, versucht es in primitiven Wert zu konvertieren

Also in diesem Fall Schritt für Schritt wird

=> []==![] 

=> []==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 

Man kann für die ecmascript Erklärung überprüfen hier im Compiler Beschreibung http://www.ecma-international.org/ecma-262/5.1/#sec-11.9.3

1

Hier ist eine genauere Erklärung von codementor.io

Bevor wir verstehen, was passiert, müssen wir das Konzept von Truthy und Falsy in JavaScript verstehen und wie die! (logischer NOT) Operator funktioniert. Werte wie false, null, undefined, NaN, 0, '' and "" gelten als falsch. Andere Werte wie *true, {}, [], "foo" * usw. gelten als truthy. Die! Der Operator ist dagegen nur für boolesche Werte definiert. Jeder andere Datentyp wird automatisch in den entsprechenden booleschen Wert umgewandelt, wenn er mit! Operator. Hier wird ![] zu falsch ausgewertet und der Vergleich wird tatsächlich '[] == false', was 'true' ergibt. Soll das nicht falsch sein, da leere Arrays truthy sind? Das stimmt, aber der Operator double equal wertet Ausdrücke bestimmter Regeln aus. Wir versuchen, ein Objekt mit einem booleschen Wert zu vergleichen, und JavaScript konvertiert die Operanden implizit in den Zahlentyp.Number([]) is 0 und Number(false) is also 0, die

1

Wann immer 2 Werte true since zero is equal to zero bewertet werden == verglichenen verwenden, führt Javascript, um die abstrakte Gleichheit Vergleichsalgorithmus.

enter image description here

Hier x [] und y []. Auch

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

Da y eine boolesche und x ist eine Aufgabe, Zustand 7 ist der erste zu halten:

Wenn Typ (y) Boolesche ist, geben das Ergebnis des Vergleichs x == ToNummer (y).

Was ist der Wert von ToNumber (y)?

weil [] ein truthy Wert ist, Negieren macht es falsch. Nummer (false) ist 0

Jetzt haben wir den Vergleich: [] == 0.

Da typeof (0) ist "Nummer", Zustand 8 jetzt gilt:

Wenn Type (x) ist Objekt und Typ (y) ist entweder String oder Zahl, Rückgabe das Ergebnis des Vergleichs ToPrimitive (x) == y.

ToPrimitve (x) ist wie x.toString().

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

Fast jetzt getan, was wir mit dem Vergleich stellen: „“ == 0

Nun Bedingung 5 gilt:

Wenn Type (x) String und Typ (y) Zahl, gebe das Ergebnis des Vergleichs ToNumber (x) == y zurück.

ToNumber(“”) // 0 

Schließlich beiden Operanden die gleiche Art und Zustand 1 gilt. Ich denke, Sie können, wenn von hier :)

lesen Sie über Abstract Equality Comparison auf die Spezifikationen!