Javascript - Những khó hiểu trong câu lệnh điều kiện if và phép toán so sánh (p2)
Javascript
260
White

Nguyễn Hồng Phúc viết ngày 27/05/2015

Mở đầu

phần trước, tôi đã tổng kết lại một số nguyên tắc của câu lệnh điều kiện if, phép so sánh =====. Chúng ta hãy cùng bắt đầu phần 2 với điều khó hiểu mà tôi nêu ra ở cuối bài trước:

0 > null; // false
0 == null; //false
0 === null; // false
0 < null; // vẫn false

Tuy nhiên

0 >= null; // true
0 <= null; // true (@@)

Một vấn đề nữa, khi tôi suy nghĩ theo cách thông thường:

1 > 'x' // false

Như vậy thì rõ ràng 1 <= 'x' sẽ là true rồi.
Tuy nhiên, khi thử biểu thức trên, kết quả lại không giống với cách nghĩ thông thường lắm. (T_T)

Phép so sánh hơn kém

Về cơ bản thì cả 4 phép toán so sánh >, >=, <, <= sẽ tuân theo quy luật sau:

  • Trường hợp cả 2 vế cùng kiểu Number hoặc String
    1. Nếu cả 2 vế là kiểu Number, so sánh giá trị của 2 số
    2. Nếu cả 2 vế là kiểu String, so sánh theo Unicode Code Point
  • Trường hợp 2 vế khác kiểu
    1. Một vế là giá trị kiểu Number, một vế là giá trị có thể chuyển được về kiểu Number, chuyển về Number và so sánh giá trị
    2. Nếu 1 trong 2 vế là NaN, false
    3. Một vế là giá trị kiểu String, một vế là giá trị có thể chuyển được về kiểu String, chuyển về kiểu String và so sánh theo Unicode Code Point
    4. Nếu một trong 2 vế không thể chuyển được về kiểu Number hoặc String, hoặc khi chuyển kiểu bị trở thành giá trị NaN, false
    5. Nếu một vế là giá trị kiểu Number, một vế là giá trị kiểu String, giá trị kiểu String sẽ được chuyển về kiểu Number và so sánh giá trị '100' > '99' // sẽ cho kết quả false, vì Code Point của '9' > Code Point của '1' '100' > 99 // sẽ cho kết quả true, vì '100' sẽ được chuyển về kiểu số thành 100 > 99

⚠ Chú ý: chỗ này dễ xảy ra BUG

Như vấn đề thứ hai tôi đã nêu ra ở phần mở đầu. Với đa số ngôn ngữ lập trình, cũng như theo cách nghĩ thông thường, nếu 2 vế của biểu thức > cho giá trị là false, vậy thì biểu thức ngược lại <= sẽ cho giá trị là true. Tuy nhiên do việc chuyển kiểu khi so sánh của javascript mà cho dù 2 vế của biểu thức cùng giá trị, 2 phép toán ><= sẽ đều cho giá trị false. Như các ví dụ dưới đây.

1 > 'x' // false
1 <= 'x' // false

Nguyên do là khi chuyển 'x' (kiểu String) sang kiểu Number: (Number('x')), giá trị 'x' bị trở thành NaN. undefined cũng tương tự như vậy:

undefined > 0 // false
undefined <= 0 // false
undefined > undefined // false

Một số ví dụ

// so sánh kiểu Boolean
true > false // kết quả là true, vì khi chuyển sang kiểu Number, 1 > 0
true > 0 // kết quả là true

// so sánh với giá trị null
null < 1 // true, vì null khi chuyển sang kiểu Number có giá trị 0, 0 < 1
null > 1 // false, 0 > 1

// so sánh kiểu object
var obj = {};
obj > 0; // false, vì obj khi chuyển sang kiểu Number là NaN, NaN > 0
obj <= 0; // false, NaN <= 0

// function
obj.valueOf = function() { return 1; }
obj > 0; // true, bởi obj giờ đã có thể chuyển sang kiểu Number, 1 > 0

Tổng kết

Như vậy tôi đã kết thúc loạt bài về câu lệnh if và các phép toán so sánh trong ngôn ngữ javascript (:phew). Quả thật javascript không hề đơn giản nhưng cũng khá thú vị. Hi vọng bài viết có ích cho các lập trình viên javascript tránh được các bug mò mãi không ra :D

Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

White

Nguyễn Hồng Phúc

9 bài viết.
43 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
38 9
Một số vấn đề Theo cá nhân tôi, Javascript có lẽ là một trong những ngôn ngữ dễ học, dễ viết nhất. Một web developer mới bắt đầu có lẽ chỉ cần từ ...
Nguyễn Hồng Phúc viết hơn 3 năm trước
38 9
White
17 3
Mở đầu Có lẽ hầu hết những người sử dụng Linux đều biết quyền hạn của 1 file hay folder được đại diện bởi r (read), w (write), x (execute) như hìn...
Nguyễn Hồng Phúc viết hơn 3 năm trước
17 3
White
15 1
Có vẻ là quá thường nhưng để bắt đầu làm gì đó “to tát” thì hay bắt đầu những việc đơn giản trước. Tôi viết bài này để chia sẻ tới những người mới ...
Nguyễn Hồng Phúc viết hơn 3 năm trước
15 1
Bài viết liên quan
White
49 8
Tăng sức mạnh cho javascript với lodash Lần này mình sẽ giới thiệu 1 thư viện javascript vô cùng bá đạo có tên là "lodash]1]", có thể nói nó là LI...
Huy Hoàng Phạm viết gần 3 năm trước
49 8
White
33 8
Lâu không post gì muốn viết một bài dài dài về js cơ mà đau đầu quá viết mãi không xong, thôi post bài ngắn vậy :smiley: Lấy screen size ở đây tôi...
Hoàng Duy viết 3 năm trước
33 8
White
8 0
Có bao giờ bạn thắc mắc, chuyện gì thực sự diễn ra khi chúng ta gõ một địa chỉ trang web (ví dụ: (Link)) lên trình duyệt và nhấn Enter? Đầu tiên, t...
Lam Pham viết 9 tháng trước
8 0
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


White
{{userFollowed ? 'Following' : 'Follow'}}
9 bài viết.
43 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!