Bạn biết có hai toán tử so sánh đẳng thức khác nhau trong JavaScript. các toán tử ===
và ==
, hoặc bộ ba bằng và gấp đôi bằng như chúng được gọi. Bạn đã thấy cả hai được sử dụng nhưng không chắc nên chọn mã nào cho mã của mình. Bạn muốn biết một cách chắc chắn để quyết định cái này hay cái kia
Hóa ra, có một cách đơn giản để quyết định nên sử dụng cái nào. Và logic tương tự cũng áp dụng cho các toán tử so sánh bất đẳng thức !==
và !=
So sánh bằng và cùng loại với ===
x === y
Toán tử ba bằng [===
] trả về true nếu cả hai toán hạng có cùng kiểu và chứa cùng một giá trị. Nếu so sánh các loại khác nhau cho bằng nhau, kết quả là sai
Định nghĩa bình đẳng này là đủ cho hầu hết các trường hợp sử dụng. Khi so sánh chuỗi "0"
và số
x == y
0 thì kết quả sai như mong muốnCác nguồn như D. Crockford và cả hai đều khuyên rằng chỉ nên sử dụng toán tử bằng ba lần khi lập trình bằng JavaScript và bỏ qua hoàn toàn toán tử bằng hai lần
Chuyển đổi loại phức tạp diễn ra với ==
x == y
Toán tử bằng kép [==
] cố gắng thực hiện chuyển đổi loại nếu các loại khác nhau và sau đó so sánh bằng nhau. Nếu các loại khác nhau, một hoặc cả hai toán hạng trước tiên được chuyển đổi thành một loại chung. Các quy tắc chuyển đổi rất phức tạp và phụ thuộc vào các loại đối số. Để có bảng so sánh đầy đủ, hãy xem ví dụ hoặc
Ví dụ: khi so sánh chuỗi "0"
và số
x == y
0, trước tiên, đối số đầu tiên được chuyển thành số"0" == 0 // becomes
ToNumber["0"] === 0
Mặc dù việc so sánh chuỗi và số là dễ hiểu, nhưng các quy tắc phức tạp cho các loại khác dẫn đến kết quả phi logic. Ví dụ: xem phần so sánh giữa
x == y
4, x == y
5 và x == y
6________số 8_______
Chỉ sử dụng ===
Sử dụng toán tử so sánh đẳng thức ba bằng [===
]. Khi cố gắng so sánh các loại khác nhau với ba bằng nhau, kết quả luôn sai. Bạn sẽ nhận được kết quả như mong đợi mà không phải tuân theo các quy tắc chuyển đổi khó ghi nhớ. So sánh táo với cam là sai như mong đợi
Lưu ý rằng các toán tử so sánh này dùng để so sánh các kiểu nguyên thủy. Để so sánh sự bình đẳng sâu sắc của các đối tượng hoặc mảng, cần có một cách tiếp cận khác để so sánh các toán hạng về mặt cấu trúc
Nút không đợi cuộc gọi cơ sở dữ liệu của bạn kết thúc?
Tìm hiểu cách cuộc gọi không đồng bộ hoạt động và làm cho ứng dụng của bạn chạy như bạn dự định. Nhận khóa học email ngắn về tính không đồng bộ và hai chương từ Hoàn thiện ứng dụng nút của bạn
“Việc xác định xem hai biến có tương đương hay không là một trong những thao tác quan trọng nhất trong lập trình. ” Đó là theo Nicholas Zakas trong cuốn sách JavaScript dành cho nhà phát triển web của anh ấy
Nói cách khác, trong suốt kịch bản của bạn, bạn có thể sẽ có những dòng giống như thế này
if [x == y] { // do something here }
Hoặc, nếu bạn đang tuân thủ các phương pháp hay nhất, điều này
if [x === y] { // do something here }
Sự khác biệt giữa hai ví dụ đó là ví dụ thứ hai sử dụng toán tử ba bằng, còn được gọi là “bằng nghiêm ngặt” hoặc “bằng giống hệt nhau”
Những người mới bắt đầu sử dụng JavaScript cố gắng tuân theo các phương pháp hay nhất có thể đang sử dụng dấu bằng ba chứ không phải dấu bằng hai lần, nhưng có thể không hiểu đầy đủ sự khác biệt là gì hoặc tại sao việc sử dụng dấu ba lần lại quan trọng
Có gì khác biệt?
Trong phép so sánh sử dụng toán tử hai dấu bằng, kết quả sẽ trả về true
nếu hai đối tượng được so sánh bằng nhau. Nhưng có một lưu ý quan trọng. Nếu phép so sánh được thực hiện giữa hai “loại” giá trị khác nhau, thì việc ép kiểu sẽ xảy ra
Mỗi giá trị JavaScript thuộc về một "loại" cụ thể. Những loại này là. Số, chuỗi, Booleans, hàm và đối tượng. Vì vậy, nếu bạn thử so sánh [ví dụ] một chuỗi với một số, trình duyệt sẽ cố gắng chuyển đổi chuỗi thành một số trước khi thực hiện so sánh. Tương tự, nếu bạn so sánh true
hoặc false
với một số, thì giá trị true
hoặc false
sẽ được chuyển đổi thành
if [x === y] { // do something here }2 hoặc
if [x === y] { // do something here }3 tương ứng
Điều này có thể mang lại kết quả không thể đoán trước. Đây là vài ví dụ
console.log[99 == "99"]; // true console.log[0 == false]; // true
Mặc dù điều này thoạt đầu có thể là một điều tốt [vì trình duyệt dường như đang giúp ích cho bạn], nhưng nó có thể gây ra sự cố. Ví dụ
console.log[' \n\n\n' == 0]; // true console.log[' ' == 0]; // true
Vì lý do này, hầu hết các chuyên gia JavaScript khuyên bạn nên luôn sử dụng toán tử ba bằng và không bao giờ sử dụng hai bằng
Toán tử ba bằng, như bây giờ bạn có thể đã hình dung ra, không bao giờ ép kiểu. Vì vậy, bất cứ khi nào bạn sử dụng ba dấu bằng, bạn đang so sánh chính xác các giá trị thực. Bạn đang đảm bảo các giá trị là 'hoàn toàn bằng nhau' hoặc 'giống hệt nhau'
Điều này có nghĩa là, khi sử dụng ba dấu bằng, tất cả các ví dụ ở trên sẽ cho kết quả chính xác
console.log[99 === "99"]; // false console.log[0 === false]; // false console.log[' \n\n\n' === 0]; // false console.log[' ' === 0]; // false
Điều gì về sự bất bình đẳng?
Khi thực hiện một biểu thức không bằng, các quy tắc tương tự sẽ được áp dụng. Ngoại trừ lần này, thay vì ba bằng vs. nhân đôi bằng, bạn đang sử dụng nhân đôi bằng với. Độc thân
Dưới đây là các ví dụ tương tự ở trên, lần này được thể hiện bằng toán tử
if [x === y] { // do something here }4
console.log[99 != "99"]; // false console.log[0 != false]; // false console.log[' \n\n\n' != 0]; // false console.log[' ' != 0]; // false
Bây giờ hãy chú ý rằng kết quả mong muốn trong mỗi trường hợp phải là “true”. Thay vào đó, chúng sai — vì kiểu ép buộc
Nếu đổi thành dấu bằng kép ta được kết quả đúng
console.log[99 !== "99"]; // true console.log[0 !== false]; // true console.log[' \n\n\n' !== 0]; // true console.log[' ' !== 0]; // true
Phần kết luận
Như đã đề cập, có lẽ bạn đã sử dụng ba bằng khá độc quyền. Trong khi nghiên cứu bài viết này, bản thân tôi đã học được một vài điều về khái niệm này
Tôi nghĩ rằng bản tóm tắt tốt nhất lại đến từ Zakas, sau khi khuyến nghị luôn sử dụng bằng nghiêm ngặt, anh ấy nói. “Điều này giúp duy trì tính toàn vẹn của loại dữ liệu trong toàn bộ mã của bạn. ”