Dlaczego ==
jest tak nieprzewidywalny?
Co otrzymujesz, porównując pusty ciąg ""
z liczbą zero 0
?
true
Tak, zgadza się ==
to z pustym ciągiem, a liczba zero to ten sam czas.
I to się nie kończy, oto kolejny:
'0' == false // true
Z tablicami robi się naprawdę dziwnie.
[1] == true // true
[] == false // true
[[]] == false // true
[0] == false // true
Potem dziwniejsze ze sznurkami
[1,2,3] == '1,2,3' // true - REALLY?!
'\r\n\t' == 0 // true - Come on!
Pogarsza się:
Kiedy równość nie jest równa?
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!
Powiem to jeszcze raz:
(A == B) && (B == C) // true
(A == C) // **FALSE**
A to tylko szalone rzeczy, które dostajesz z prymitywami.
To zupełnie nowy poziom szaleństwa, gdy używasz ==
przedmiotów.
W tym momencie prawdopodobnie zastanawiasz się ...
Dlaczego to się dzieje?
Jest tak, ponieważ w przeciwieństwie do „triple equals” ( ===
), który sprawdza tylko, czy dwie wartości są takie same.
==
robi całą masę innych rzeczy .
Ma specjalną obsługę dla funkcji, specjalną obsługę dla wartości zerowych, niezdefiniowanych, ciągów, jak to nazwiesz.
Robi się dziwnie.
W rzeczywistości, jeśli spróbujesz napisać funkcję, która robi to ==
, co by wyglądała, wyglądałby mniej więcej tak:
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();
}
Co to znaczy?
Oznacza ==
to, że jest skomplikowane.
Ponieważ jest to skomplikowane, trudno jest wiedzieć, co się stanie, gdy go użyjesz.
Co oznacza, że możesz skończyć z błędami.
Morał tej historii to ...
Spraw, aby twoje życie było mniej skomplikowane.
Użyj ===
zamiast ==
.
Koniec.
=== vs ==
, ale w PHP, można przeczytać tutaj: stackoverflow.com/questions/2401478/hy-is-faster-than-in-php/...