Hướng dẫn so sánh javascript
Có những phép so sánh mà chúng ta biết từ toán học: Show
Boolean là kết quả
Tương tự như các phép tính khác, phép so sánh được trả về là một giá trị. Giá trị đó trả về là dạng boolean.
Một kết quả so sánh có thể gán vào một biến như bất kì giá trị nào:
So sánh chuỗiĐể xem chuỗi nào lớn hơn chuỗi kia, thứ tự "từ điển" được sử dụng để so sánh. Nói cách khác, các chuỗi được so sánh với nhau theo từng chữ cái.
Thuật toán so sánh 2 chuỗi rất đơn giản:
Ở ví dụ trên, phép so sánh 'Z' > 'A' ra kết quả là true Chuỗi 'Glow' và 'Glee' được so sánh theo từng kí tự:
Phép so sánh ở trên tương đương với phép toán sử dụng trong cuốn từ điển hay cuốn danh bạ. Nhưng không hẳn là hoàn toàn giống nhau. Ví dụ, viết hoa và viết thường rất quan trọng. Chữ hoa "A" không bằng với chữ thường "a". Chữ nào lớn hơn? Thực tế là chữ thường "a". Tại sao lại như vậy? Bởi ký tự chữ thường có số lớn hơn trong bảng mã Unicode. So sánh những giá trị có dạng dữ liệu khác nhauKhi so sánh những giá trị có dạng dữ liệu khác nhau, những giá trị đó được chuyển đổi thành số.
Với giá trị boolean, true chuyển về là 1 và false chuyển về là 0.
Trong một vài trường hợp:
Trong Javascript, trường hợp này là khá bình thường. Việc kiểm tra bằng nhau thường bằng cách sử dụng chuyển đổi số (từ đó mà "0" chuyển thành 0), việc chuyển đổi Boolean thường sử dụng quy tắc khác. Kiểm tra bằng nhau nghiêm ngặtViệc kiểm tra bằng nhau sử dụng "==" thường có vấn đề. Phép kiểm tra này thường không phân biệt được sự khác nhau giữa 0 và false:
Trường hợp này tương tự với chuỗi rỗng:
Đây là bởi toán hạng của các dạng dữ liệu khác nhau được chuyển về là số. Từ đó, một chuỗi rỗng, tương tự như false, chuyển về 0. Vậy chúng ta cần làm gì để phân biệt được 0 với false? Phương pháp kiểm tra bằng nhau nghiêm ngặt "===" sẽ giúp chúng ta kiểm tra bằng nhau mà không làm chuyển đổi kiểu dữ liệu. Nói cách khác, nếu a và b là 2 dạng dữ liệu khác nhau, thì việc sử dụng phép so sánh a === b sẽ lập tức chuyển về false khi mà dạng dữ liệu không được chuyển đổi.
Cũng có một phép so sánh gọi là "kiểm tra bằng nhau không nghiêm ngặt" bằng cách sử dụng "!==" tương tự như "!=". So sánh với null và undefinedCó một vài trường hợp khi null hoặc undefined được so sánh với những giá trị khác. Với việc kiểm tra bằng nhau nghiêm ngặt === Những giá trị này là khác nhau bởi mỗi giá trị này thuộc kiểu dữ liệu khác nhau.
Với việc kiểm tra không nghiêm ngặt == Đây là quy tắc đặc biệt. Hai giá trị null và undefined bằng nhau nhưng không bằng những giá trị khác.
Với việc so sánh thông thường < > <= >= Giá trị null/undefined được chuyển về giá trị số: null chuyển thành 0, undefined chuyển về NaN. Kết quả lạ giữa null và 0
Ở kết quả cuối trong ví dụ trên ta thấy null lớn hơn hoặc bằng 0. Vậy nghĩa là một trong hai phép so sánh kia là đúng, nhưng cả hai đều sai. Nguyên nhân là do việc kiểm tra bằng nhau == và phép so sánh thông thường > < >= <= hoạt động khác nhau. Việc so sánh chuyển giá trị null về số và trở thành 0. Vì thế ở trường hợp null >= 0 là true mà null > 0 là false. Mặt khác, việc kiểm tra bằng nhau == cho undefined và null lại không chuyển đổi giá trị. Vì thế 2 giá trị này bằng nhau nhưng không bằng những giá trị nào khác. Từ đó vì sao null == 0 trả về là false. Undefined không thể so sánh đượcGiá trị undefined không nên sử dụng vào so sánh:
Tại sao undefined lại luôn trả về giá trị false?
Tránh gặp vấn đềTại sao chúng ta phải xem những ví dụ này? Chúng ta có cần phải nhớ những thứ này bất cứ lúc nào không? Thực tế, những vấn đề phức tạp này sẽ dần trở nên quen thuộc theo thời gian. Tuy nhiên, có một cách chắc chắn để tránh được mọi vấn đề này. Hãy coi bất cứ so sánh nào với undefined/null một cách đặc biệt, trừ trường hợp so sánh nghiêm ngặt ===. Không sử dụng phép so sánh > < >= <= với biến undefined/null trừ khi chúng ta chắc chắn biết mình đang làm gì. Nếu một biến có các giá trị này, hãy kiểm tra biến đó một cách riêng biệt. Tóm tắt
|