2012-08-17 17 views
7

In einem aktuellen Beitrag auf http://wtfjs.com/. Ein Autor schreibt folgendes ohne Erklärung, was wahr ist.Warum ist "0 === -0" in JavaScript wahr?

Mein Verständnis über === Operator ist True, wenn Operanden auf dasselbe Objekt zeigen.

Außerdem - gibt der Operator einen Verweis auf den negativen Wert des Operanden zurück. Mit dieser Regel sollten 0 und -0 nicht identisch sein.

Also, warum ist 0 === -0?

Antwort

5

Tatsächlich sind 0 und -0 nicht gleich auf der Bit-Ebene. Es ist jedoch ein Sonderfall für +/- 0 implementiert, so dass sie als gleichwertig verglichen werden.

Der Operator === vergleicht nach Wert, wenn er auf Primitivnummern angewendet wird.

+0

Es ergänzt sie sind nicht die gleichen, aber zu zweit sind sie. –

+0

@ColeJohnson Ich habe das Zweierkomplement für ein bisschen vergessen. Javascript verwendet IEEE 64-Bit-Fließkommazahl für Zahlen, was das eigene Komplement ist. –

+0

so scheint es Sonderfall in JavaScript behandelt. – riship89

6

=== bedeutet nicht immer auf das gleiche Objekt zeigen. Bei Objekten, aber bei Werttypen vergleicht es den Wert. Daher, wie das funktioniert:

var x = 0; 
var y = 0; 
var isTrue = (x === y); 
document.write(isTrue); // true 

JavaScript verwendet IEEE Floating-Point-Standard, wobei 0 und -0 sind zwei verschiedene Zahlen, aber die ECMAScript standard Staaten der Parser muss 0 interpretieren und -0 als das gleiche:

§5.2 (Seite 12)

Mathematische Operationen wie Addition, Subtraktion, Negation, Multiplikation, Division und die später in diesem Abschnitt definierten mathematischen Funktionen sollten immer als Berechnung exakter mathematischer Ergebnisse auf mathematischen reellen Zahlen verstanden werden nicht enthalten Unendlichkeiten und enthalten keine negative Null, die von positiven Null unterschieden wird. Algorithmen in diesem Standard, die Fließkomma-Arithmetik modellieren, enthalten explizite Schritte , falls erforderlich, um Unendlichkeiten und vorzeichenbehaftete Null zu behandeln und Rundungen durchzuführen. Wenn eine mathematische Operation oder Funktion auf eine Gleitkommazahl angewendet wird, sollte dies so verstanden werden, dass sie auf den exakten mathematischen Wert angewendet wird, der durch diese Gleitkommazahl dargestellt wird; Solch eine Fließkommazahl muss endlich sein, und wenn es +0 oder -0 ist, ist der entsprechende mathematische Wert einfach 0.

+0

so ist es ein besonderer Fall in JavaScript implementiert oder negativen Zahlen Ergänzung mit 2 der ausgewertet? – riship89

+0

@ hrishikeshp19 IEEE-Gleitkomma-Standard ist eine Ergänzung mit Ausnahme von diesem. –

+0

Es ist nicht nur der Parser. 'a === -a 'wo a ist 0 ergibt wahr. –

3

Primitive Zahlen sind keine Objekte. Sie machen einen Wertvergleich der Zahlen, keinen Identitätsvergleich von Objekten.

positive Null ist gleich Null. Diese

ist aus dem Vergleichsalgorithmus für den === Operator

Wenn Type (x) Zahl ist, dann

  • Wenn x NaN ist, return false.

  • Wenn y NaN ist, geben Sie false zurück.

  • Wenn x derselbe Zahlenwert wie y ist, geben Sie true zurück.

  • Wenn x +0 und y -0 ist, wird true zurückgegeben.

  • Wenn x ist -0 und y ist +0, true zurück.

  • Rückgabe false.

+2

+1. Weil -0 tatsächlich eine Zahl in JavaScript ist (weil alle Zahlen wirklich IEEE-754-Gleitkommazahlen sind, die eine negative Null darstellen können). Es ist nur so definiert, dass es gleich 0 ist, damit die Leute nicht verrückt werden. –