Mengapa ==
begitu tak terduga?
Apa yang Anda dapatkan ketika Anda membandingkan string kosong ""
dengan angka nol 0
?
true
Yap, itu benar menurut ==
string kosong dan angka nol adalah waktu yang sama.
Dan itu tidak berakhir di sini, ini satu lagi:
'0' == false // true
Banyak hal menjadi aneh dengan array.
[1] == true // true
[] == false // true
[[]] == false // true
[0] == false // true
Kemudian aneh dengan string
[1,2,3] == '1,2,3' // true - REALLY?!
'\r\n\t' == 0 // true - Come on!
Itu semakin buruk:
Kapan sama tidak sama?
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!
Izinkan saya mengatakan itu lagi:
(A == B) && (B == C) // true
(A == C) // **FALSE**
Dan ini hanya hal-hal gila yang Anda dapatkan dengan primitif.
Ini benar-benar tingkat gila saat Anda gunakan ==
dengan benda.
Pada titik ini Anda mungkin bertanya-tanya ...
Mengapa ini terjadi?
Yah itu karena tidak seperti "triple sama dengan" ( ===
) yang hanya memeriksa apakah dua nilai sama.
==
melakukan banyak hal lainnya .
Ini memiliki penanganan khusus untuk fungsi, penanganan khusus untuk nulls, tidak terdefinisi, string, apa saja.
Agak aneh.
Bahkan, jika Anda mencoba untuk menulis fungsi yang melakukan apa ==
yang akan terlihat seperti ini:
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();
}
Jadi apa artinya ini?
Artinya ==
rumit.
Karena rumit, sulit untuk mengetahui apa yang akan terjadi ketika Anda menggunakannya.
Yang berarti Anda bisa berakhir dengan bug.
Jadi moral dari cerita ini adalah ...
Buat hidup Anda lebih mudah.
Gunakan ===
sebagai ganti ==
.
Tamat.
=== vs ==
, tetapi dalam PHP, dapat membaca di sini: stackoverflow.com/questions/2401478/why-is-faster-than-in-php/…