Trước hết, sự thật:
if (booleanValue)
Sẽ đáp ứng if
câu lệnh cho bất kỳ giá trị trung thực nào booleanValue
bao gồm true
, mọi số khác không, mọi giá trị chuỗi không trống, bất kỳ tham chiếu đối tượng hoặc mảng, v.v ...
Mặt khác:
if (booleanValue === true)
Điều này sẽ chỉ đáp ứng if
điều kiện nếu booleanValue
chính xác bằng true
. Không có giá trị trung thực khác sẽ đáp ứng nó.
Mặt khác, nếu bạn làm điều này:
if (someVar == true)
Sau đó, những gì Javascript sẽ làm là gõ cưỡng chế true
để khớp với loại someVar
và sau đó so sánh hai biến. Có rất nhiều tình huống mà điều này có khả năng không phải là những gì người ta sẽ có ý định. Bởi vì điều này, trong hầu hết các trường hợp bạn muốn tránh ==
vì có một bộ quy tắc khá dài về cách Javascript sẽ loại hai thứ cùng loại và trừ khi bạn hiểu tất cả các quy tắc đó và có thể dự đoán mọi thứ mà trình thông dịch JS có thể làm khi đưa ra hai loại khác nhau (mà hầu hết các nhà phát triển JS không thể), bạn có thể muốn tránh ==
hoàn toàn.
Như một ví dụ về mức độ khó hiểu của nó:
var x;
x = 0;
console.log(x == true); // false, as expected
console.log(x == false); // true as expected
x = 1;
console.log(x == true); // true, as expected
console.log(x == false); // false as expected
x = 2;
console.log(x == true); // false, ??
console.log(x == false); // false
Đối với giá trị 2
, bạn sẽ nghĩ rằng đó 2
là một giá trị trung thực vì vậy nó sẽ được so sánh thuận lợi true
, nhưng đó không phải là cách thức hoạt động của kiểu ép buộc. Nó đang chuyển đổi giá trị bên tay phải để khớp với loại giá trị bên trái để nó chuyển đổi true
thành số 1
để so sánh 2 == 1
đó chắc chắn không phải là điều bạn dự định.
Vì vậy, người mua hãy cẩn thận. Có thể tốt nhất nên tránh ==
trong gần như tất cả các trường hợp trừ khi bạn biết rõ ràng các loại bạn sẽ so sánh và biết tất cả các loại thuật toán cưỡng chế có thể hoạt động như thế nào.
Vì vậy, nó thực sự phụ thuộc vào các giá trị dự kiến booleanValue
và cách bạn muốn mã hoạt động. Nếu bạn biết trước rằng nó sẽ chỉ có một true
hoặc một false
giá trị, thì hãy so sánh nó với
if (booleanValue === true)
chỉ là mã bổ sung và không cần thiết và
if (booleanValue)
nhỏ gọn hơn và được cho là sạch hơn / tốt hơn.
Mặt khác, nếu bạn không biết điều gì booleanValue
có thể xảy ra và bạn muốn kiểm tra xem nó có thực sự được đặt thành true
không có chuyển đổi loại tự động nào khác không, thì
if (booleanValue === true)
không chỉ là một ý tưởng tốt, nhưng được yêu cầu.
Ví dụ, nếu bạn xem việc triển khai .on()
trong jQuery, nó có giá trị trả về tùy chọn. Nếu cuộc gọi lại trả về false
, thì jQuery sẽ tự động dừng việc truyền bá sự kiện. Trong trường hợp cụ thể này, vì jQuery muốn tuyên truyền dừng CHỈ nếu false
được trở lại, họ kiểm tra explicity giá trị trả về cho === false
vì họ không muốn undefined
hoặc 0
hoặc ""
hoặc bất cứ điều gì khác mà sẽ tự động gõ-convert false để đáp ứng cũng so sánh.
Ví dụ: đây là mã gọi lại xử lý sự kiện jQuery:
ret = ( specialHandle || handleObj.handler ).apply( matched.elem, args );
if ( ret !== undefined ) {
event.result = ret;
if ( ret === false ) {
event.preventDefault();
event.stopPropagation();
}
}
Bạn có thể thấy rằng jQuery đang tìm kiếm rõ ràng ret === false
.
Tuy nhiên, cũng có nhiều vị trí khác trong mã jQuery nơi kiểm tra đơn giản hơn phù hợp với mong muốn của mã. Ví dụ:
// The DOM ready check for Internet Explorer
function doScrollCheck() {
if ( jQuery.isReady ) {
return;
}
...