Tại sao lại ==
khó đoán như vậy?
Bạn nhận được gì khi so sánh một chuỗi rỗng ""
với số 0 0
?
true
Đúng, đó là đúng theo ==
một chuỗi trống và số 0 là cùng một lúc.
Và nó không kết thúc ở đó, đây là một cái khác:
'0' == false // true
Mọi thứ trở nên thực sự kỳ lạ với mảng.
[1] == true // true
[] == false // true
[[]] == false // true
[0] == false // true
Sau đó, weirder với chuỗi
[1,2,3] == '1,2,3' // true - REALLY?!
'\r\n\t' == 0 // true - Come on!
Nó trở nên tồi tệ hơn:
Khi nào bằng nhau không bằng?
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!
Hãy để tôi nói rằng một lần nữa:
(A == B) && (B == C) // true
(A == C) // **FALSE**
Và đây chỉ là những thứ điên rồ mà bạn có được với người nguyên thủy.
Đó là một mức độ hoàn toàn mới khi bạn sử dụng ==
với các đối tượng.
Tại thời điểm này có lẽ bạn đang tự hỏi ...
Lý do tại sao điều này xảy ra?
Vâng, bởi vì không giống như "ba bằng" ( ===
) chỉ kiểm tra xem hai giá trị có giống nhau không.
==
làm một loạt các công cụ khác .
Nó có xử lý đặc biệt cho các hàm, xử lý đặc biệt cho null, không xác định, chuỗi, bạn đặt tên cho nó.
Nó khá là lập dị.
Trong thực tế, nếu bạn đã cố gắng viết một hàm làm những gì ==
nó sẽ trông giống như thế này:
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();
}
Vì vậy, điều này có nghĩa là gì?
Nó có nghĩa ==
là phức tạp.
Bởi vì nó phức tạp, thật khó để biết điều gì sẽ xảy ra khi bạn sử dụng nó.
Điều đó có nghĩa là bạn có thể kết thúc với lỗi.
Vì vậy, đạo đức của câu chuyện là ...
Làm cho cuộc sống của bạn bớt phức tạp.
Sử dụng ===
thay vì ==
.
Kết thúc.
=== vs ==
, nhưng trong PHP, có thể đọc tại đây: stackoverflow.com/questions/2401478/why-is-faster-than-in-php/iêu