Warum === schneller als == in JavaScript? [geschlossen]

3 Antworten

16

Hier ist, was Javascript für === :

  1. Wenn Typ (x) sich von Typ (y) unterscheidet, geben Sie false zurück.
  2. Wenn Typ (x) nicht definiert ist, geben Sie true zurück.
  3. Wenn Typ (x) Null ist, gebe true zurück.
  4. Wenn Typ (x) Nummer ist, dann
    1. Wenn x NaN ist, gebe false zurück.
    2. Wenn y NaN ist, gebe false zurück.
    3. Wenn x derselbe Zahlenwert wie y ist, geben Sie true zurück.
    4. Wenn x +0 und y -0 ist, geben Sie true zurück.
    5. Ist x gleich -0 und y ist +0, true zurück.
    6. Gibt false zurück.
  5. Wenn Typ (x) String ist, dann true zurück, wenn x und y genau die gleiche Zeichenfolge sind (gleiche Länge und gleiche Zeichen an den entsprechenden Positionen); Andernfalls gebe false zurück.
  6. Wenn Typ (x) Boolesch ist, true zurück, wenn x und y beide wahr oder beide falsch sind; Andernfalls gebe false zurück.
  7. Gibt true zurück, wenn sich x und y auf dasselbe Objekt beziehen. Andernfalls gebe false zurück.

Und hier ist, was es für == zu tun hat:

  1. Wenn Typ (x) derselbe wie Typ (y) ist, dann
    1. Wenn Typ (x) nicht definiert ist, geben Sie true zurück.
    2. Wenn Typ (x) Null ist, gebe true zurück.
    3. Wenn Typ (x) Nummer ist, dann
      1. Wenn x NaN ist, gebe false zurück.
      2. Wenn y NaN ist, gebe false zurück.
      3. Wenn x derselbe Zahlenwert wie y ist, geben Sie true zurück.
      4. Wenn x +0 und y -0 ist, geben Sie true zurück.
      5. Ist x gleich -0 und y ist +0, true zurück.
      6. Gibt false zurück.
    4. Wenn Type (x) String ist, dann true zurück, wenn x und y genau die gleiche Zeichenfolge sind (gleiche Länge und gleiche Zeichen an den entsprechenden Positionen). Andernfalls gebe false zurück.
    5. Wenn Type (x) Boolean ist, true zurück, wenn x und y beide wahr oder beide falsch sind. Andernfalls gebe false zurück.
    6. Gibt true zurück, wenn sich x und y auf dasselbe Objekt beziehen. Andernfalls gebe false zurück.
  2. Wenn x null ist und y undefiniert ist, true zurück.
  3. Wenn x nicht definiert ist und y null ist, gebe true zurück.
  4. Wenn Typ (x) die Nummer und Typ (y) die Zeichenfolge String ist, geben Sie das Ergebnis des Vergleichs x == ToNumber (y) zurück.
  5. Wenn Typ (x) String und Typ (y) Zahl ist, das Ergebnis des Vergleichs ToNumber (x) == y.
  6. zurückgeben
  7. Wenn Type (x) Boolean ist, geben Sie das Ergebnis des Vergleichs ToNumber (x) == y.
  8. zurück
  9. Wenn Type (y) Boolean ist, gebe das Ergebnis des Vergleichs x == ToNumber (y).
  10. zurück
  11. Wenn Typ (x) entweder String oder Zahl und Typ (y) Objekt ist, Rückgabe des Ergebnisses des Vergleichs x == ToPrimitive (y).
  12. Wenn Typ (x) Objekt und Typ (y) entweder Zeichenfolge oder Zahl ist, Rückgabe des Ergebnisses des Vergleichs ToPrimitive (x) == y.
  13. Gibt false zurück.

Beachten Sie, dass die Operatoren dasselbe tun, wenn Type(x) gleich Type(y) ist. Wenn dies jedoch nicht der Fall ist, muss == möglicherweise verschiedene Konvertierungen durchführen, während === nur false zurückgibt.

Bei den Links, die Sie angegeben haben, sind die Typen, die verglichen werden, tatsächlich gleich, so dass die beiden Operatoren etwa gleich funktionieren sollten. Unterschiede würden hier auf Implementierungsdetails beruhen - da sie unterschiedliche Dinge tun, können sie für unterschiedliche Zwecke optimiert werden. Theoretisch, da === weniger macht, würde man denken, dass es immer schneller wäre, aber das scheint für bestimmte Builds von Firefox nicht der Fall zu sein, zumindest wenn diese Benchmarks korrekt sind.

Jedoch sehen Sie den Unterschied, wenn die Typen unterschiedlich sind . Wenn Sie "hi" === {} ausführen, erhalten Sie ~ 66 Millionen Ops / Sekunde, aber für "hi" == {} haben Sie nur ~ 4 Millionen Ops / Sekunde.

    
Claudiu 27.09.2013 02:57
quelle
4

=== vergleicht, ob die Werte und die Typen gleich sind.
== vergleicht, wenn die Werte identisch sind, aber es gibt auch Konvertierungen in den Vergleich ein. Diese Typumwandlungen machen == langsamer als ===.

    
JKor 27.09.2013 02:59
quelle
4

JavaScript ist eine schwach typisierte Sprache, daher wird, wo immer möglich, type cercion angewendet. . .

entspricht Operator

%Vor%

Der Strikte Gleichheitsoperator

Es funktioniert wie der normale Gleichheitsoperator, außer dass der strenge Gleichheitsoperator keine Typumwandlung zwischen seinen Operanden vornimmt.

%Vor%

Die obigen Ergebnisse sind viel klarer und ermöglichen eine frühzeitige Unterbrechung des Codes. Dies härtet den Code bis zu einem gewissen Grad und führt auch zu Leistungsverbesserungen, wenn die Operanden von verschiedenen Typen sind.

So === schneller als == in Javascript

Hier ist eine gute Referenz

    
Dipak Ingole 27.09.2013 03:09
quelle

Tags und Links