it-swarm.com.de

JavaScript-Leistungsunterschied zwischen Double Equal (==) und Triple Equal (===)

Gibt es in JavaScript einen Leistungsunterschied zwischen der Verwendung eines Double Equals (==) und der Verwendung eines Triple Equals (===)?

Beispiel: if (foo == bar) vs if (foo === bar)

36
Eric

Ein strenger Vergleich (===) ist immer etwas schneller, aber der Unterschied ist normalerweise zu vernachlässigen .

Es ist auf jeden Fall sinnvoll, === zu bevorzugen, wenn Sie sicher sind, dass Sie im Vergleich keinen Typzwang benötigen. Es wird immer mindestens so schnell sein wie ==.

26
Dave Ward
  • Wenn die verglichenen Typen gleich sind, sind sie sind identisch . Das heißt, sie verwenden den exakt gleichen Algorithmus .

  • Wenn die Typen different sind, ist die Leistung irrelevant. Entweder brauchst du Typzwang oder nicht. Wenn Sie es nicht benötigen, verwenden Sie == nicht, da das Ergebnis möglicherweise unerwartet ist.

40
user1034768

Edit: als Referenz hier ist das durch die Spezifikation Erklärung von Dr. Axel Rauschmayer http://www.2ality.com/2011/06/javascript- equality.html Wirklich großartig schreiben.

=== (strikte Gleichheit): Berücksichtigt nur Werte, die denselben Typ haben.

  1. undefined === undefined, null === null,
  2. NaN === nichts einschließlich sich selbst,
  3. Primitiv [Number | String | Boolean] === Primitivwert ist gleich,
  4. zu sich selbst (+0 === -0)
  5. Zwei Objekte [Array | Object | Function] === Nur self (gleiche exakte Entität)

== (Lenient Gleichheit)

  1. Wenn beide Werte denselben Typ haben: Vergleichen Sie mit ===.
  2. undefined == null
  3. number und string: string => number und compare
  4. boolean und nicht-boolean => nicht-boolean zum Nummerieren und Vergleichen
  5. string oder number => ein Objekt: Objekt in Grundelement und Vergleich konvertieren.

In allen modernen Javascript-Umgebungen werden sie völlig unterschiedlich implementiert. Einfach ausgedrückt, == testet die Ähnlichkeit, indem gegebene Variablen in Grundelemente (String, Number, Boolean) umgewandelt werden. === prüft auf strenge Gleichheit, d. h. genau denselben Objekt- oder Grundwert ohne Konvertierung.

Wenn Sie objOne == objTwo Ausführen, geschieht Folgendes: [[EQUALS]].call(objOne.valueOf(), objTwo.valueOf())

Die Auflösung von valueOf kann etwas involviert sein und zwischen Funktionen, die in JS verfügbar gemacht werden, und internen Engine-Sachen springen. Es genügt zu sagen, dass der Vergleich immer zu zwei Werten führt, die zum primitiven Element gezwungen werden, oder es wird ein Fehler ausgegeben.

Edit: EQUALS versucht zuerst STRICT_EQUALS, was den Rest des Prozesses vorsieht.

Das Interessante dabei ist, dass valueOf (und sein Partner toString) überschreibbar sind. Führen Sie diesen Code in Chrome aus (ich denke, jedes Webkit ist nicht sicher, ob JSC und V8 diesen Leckerbissen teilen). Es wird dich umhauen:

var actions = [];
var overload = {
  valueOf: function(){
    var caller = arguments.callee.caller;
    actions.Push({
      operation: caller.name,
      left: caller.arguments[0] === this ? "unknown" : this,
      right: caller.arguments[0]
    });
    return Object.prototype.toString.call(this);
  }
};
overload.toString = overload.valueOf;
overload == 10;
overload === 10;
overload * 10;
10 / overload;
overload in window;
-overload;
+overload;
overload < 5;
overload > 5;
[][overload];
overload == overload;
console.log(actions);

Ausgabe:

[ { operation: 'EQUALS',
    left: overload,
    right: 10 },
  { operation: 'MUL',
    left: overload,
    right: 10 },
  { operation: 'DIV',
    left: 'unknown',
    right: overload },
  { operation: 'IN',
    left: overload,
    right: DOMWindow },
  { operation: 'UNARY_MINUS',
    left: overload,
    right: undefined },
  { operation: 'TO_NUMBER',
    left: overload,
    right: undefined },
  { operation: 'COMPARE',
    left: overload,
    right: 5 },
  { operation: 'COMPARE',
    left: 'unknown',
    right: overload },
  { operation: 'ToString',
    left: 'unknown',
    right: overload } ]

Der wesentliche Unterschied zwischen == und === wird dadurch veranschaulicht, dass === nicht in dieser Liste angezeigt wird. Die Reise in JavascriptLand wird vollständig übersprungen. Dieses Abenteuer ist teuer, wenn man die Leistung vergleicht.

Sie müssen jedoch die Motoroptimierungen berücksichtigen. Bei den meisten Objekten kann die Engine die meisten Schritte ausschalten, im NativeLand bleiben und fast dieselbe Leistung erzielen. Dies ist jedoch keine Garantie und wenn etwas die Engine nicht in der Lage ist, die Optimierungen zu nutzen, etwas Phantasie in Ihrem Code oder das Überschreiben der eingebauten Module oder eine Vielzahl von Problemen, dann sehen Sie sofort das Ergebnis in Leistung. === zwingt es.

=== ist so ziemlich das einzige unveränderliche Ding in Javascript.

14
user748221

Ich denke, === hat eine bessere Leistung, da === strenger ist als ==.

z.B. Versuchen Sie Folgendes in der Chrome-Konsole.

> 1 == '1'
  true
> 1 === '1'
  false

== muss mehr prüfen als ===

3
James.Xu

Bei einigen Tests ist == etwas schneller als ===.

Am Rande meine ich damit, dass ich einige Millisekunden Unterschied zwischen den Tests vieler Millionen Tests sehen kann. Sie können den Leistungszuwachs möglicherweise nicht benötigen, anstatt das zu verwenden, was für die anstehende Aufgabe am besten geeignet ist.

BEARBEITEN: Eigentlich hängt davon ab, was Sie vergleichen und welche Browserimplementierung Sie verwenden. Mit anderen Worten, mach dir keine Sorgen.

1
Hamish

Das hängt von den Gegenständen ab, die verglichen werden. Da "===" strenger als "==" ist, sollte false schneller zurückgegeben werden als "==". Wenn die beiden Elemente genau gleich sind, sollte "===" mehr Zeit in Anspruch nehmen als "==", da mehr Eigenschaften auf Gleichheit geprüft werden müssen.

0
Joseph C