Warum ==
so unberechenbar ist?
Was erhalten Sie, wenn Sie eine leere Zeichenkette vergleichen ""
mit der Zahl Null 0
?
true
Ja, das ist richtig, laut ==
eine leere Zeichenkette und die Zahl Null sind gleichzeitig.
Und das ist noch nicht alles, hier ist noch eine weitere:
'0' == false // true
Mit Arrays werden die Dinge wirklich seltsam.
[1] == true // true
[] == false // true
[[]] == false // true
[0] == false // true
Dann noch seltsamer mit Strings
[1,2,3] == '1,2,3' // true - REALLY?!
'\r\n\t' == 0 // true - Come on!
Es wird noch schlimmer:
Wann ist gleich nicht gleich?
let A = '' // empty string
let B = 0 // zero
let C = '0' // zero string
A == B // true - ok...
B == C // true - so far so good...
A == C // **FALSE** - Plot twist!
Lassen Sie mich das noch einmal sagen:
(A == B) && (B == C) // true
(A == C) // **FALSE**
Und das sind nur die verrückten Dinge, die man mit Primitiven erreichen kann.
Es ist eine ganz neue Stufe der Verrücktheit, wenn man ==
mit Objekten.
An diesem Punkt fragen Sie sich wahrscheinlich...
Warum ist das so?
Nun, das liegt daran, dass im Gegensatz zu "Triple Equals" ( ===
), die nur prüft, ob zwei Werte gleich sind.
==
macht eine einen ganzen Haufen anderer Dinge .
Es hat eine spezielle Handhabung für Funktionen, eine spezielle Handhabung für Nullen, undefinierte, Zeichenketten, was auch immer.
Es wird ziemlich verrückt.
Wenn Sie nämlich versuchen würden, eine Funktion zu schreiben, die das tut, was ==
würde es etwa so aussehen:
function isEqual(x, y) { // if `==` were a function
if(typeof y === typeof x) return y === x;
// treat null and undefined the same
var xIsNothing = (y === undefined) || (y === null);
var yIsNothing = (x === undefined) || (x === null);
if(xIsNothing || yIsNothing) return (xIsNothing && yIsNothing);
if(typeof y === "function" || typeof x === "function") {
// if either value is a string
// convert the function into a string and compare
if(typeof x === "string") {
return x === y.toString();
} else if(typeof y === "string") {
return x.toString() === y;
}
return false;
}
if(typeof x === "object") x = toPrimitive(x);
if(typeof y === "object") y = toPrimitive(y);
if(typeof y === typeof x) return y === x;
// convert x and y into numbers if they are not already use the "+" trick
if(typeof x !== "number") x = +x;
if(typeof y !== "number") y = +y;
// actually the real `==` is even more complicated than this, especially in ES6
return x === y;
}
function toPrimitive(obj) {
var value = obj.valueOf();
if(obj !== value) return value;
return obj.toString();
}
Was bedeutet das also?
Das bedeutet ==
ist kompliziert.
Da es kompliziert ist, ist es schwer zu wissen, was passiert, wenn man es benutzt.
Das bedeutet, dass Sie mit Fehlern konfrontiert werden könnten.
Die Moral von der Geschicht' ist also...
Machen Sie Ihr Leben weniger kompliziert.
Verwenden Sie ===
anstelle von ==
.
Das Ende.