Warum ==
ist das so unvorhersehbar?
Was bekommen Sie, wenn Sie eine leere Zeichenfolge ""
mit der Zahl Null vergleichen 0
?
true
Ja, das stimmt ==
einer leeren Zeichenfolge und die Zahl Null ist dieselbe Zeit.
Und es endet nicht dort, hier ist noch eines:
'0' == false // true
Mit Arrays wird es wirklich komisch.
[1] == true // true
[] == false // true
[[]] == false // true
[0] == false // true
Dann seltsamer mit Saiten
[1,2,3] == '1,2,3' // true - REALLY?!
'\r\n\t' == 0 // true - Come on!
Es wird 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 ist nur das verrückte Zeug, das man mit Primitiven bekommt.
Es ist eine ganz neue Ebene der Verrücktheit, wenn Sie ==
mit Objekten verwenden.
An diesem Punkt wundern Sie sich wahrscheinlich ...
Warum passiert das?
Nun, es liegt daran, dass im Gegensatz zu "Triple Equals" ( ===
) nur geprüft wird, ob zwei Werte gleich sind.
==
macht eine ganze Reihe anderer Sachen .
Es hat eine spezielle Behandlung für Funktionen, eine spezielle Behandlung für Nullen, undefinierte Zeichenfolgen, wie Sie es nennen.
Es wird ziemlich verrückt.
Wenn Sie versuchen würden, eine Funktion zu schreiben, die das ==
tut , was sie tut, würde sie ungefähr 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?
Es bedeutet ==
ist kompliziert.
Da es kompliziert ist, ist es schwer zu wissen, was passieren wird, wenn Sie es verwenden.
Was bedeutet, dass Sie mit Fehlern enden könnten.
Die Moral der Geschichte lautet also ...
Machen Sie Ihr Leben weniger kompliziert.
Verwenden Sie ===
anstelle von ==
.
Das Ende.
=== vs ==
, aber für PHP, kann hier gelesen werden: stackoverflow.com/questions/2401478/why-is-faster-than-in-php/…