Toán tử so sánh ECMAScript

Toán tử quan hệ thực hiện phép so sánh. Mỗi toán tử quan hệ đều trả về một giá trị Boolean.

Cách so sánh thông thường

Toán tử quan hệ "nhỏ hơn", "lớn hơn", "nhỏ hơn hoặc bằng" và "lớn hơn hoặc bằng" thực hiện phép so sánh hai số, cách so sánh này giống như phép so sánh toán học.

Mỗi toán tử quan hệ đều trả về một giá trị Boolean:

var bResult1 = 2 > 1	//true
var bResult2 = 2 < 1	//false

Tuy nhiên, khi áp dụng toán tử quan hệ cho hai chuỗi, hành vi của chúng lại khác nhau. Nhiều người nghĩ rằng "nhỏ hơn" có nghĩa là "tiếp theo trong thứ tự alphabet", "lớn hơn" có nghĩa là "sau trong thứ tự alphabet", nhưng thực tế không phải vậy. Đối với chuỗi, mỗi ký tự của chuỗi đầu tiên sẽ được so sánh với mã ký tự của ký tự ở vị trí tương ứng của chuỗi thứ hai. Sau khi hoàn thành quá trình so sánh này, sẽ trả về một giá trị Boolean. Vấn đề là mã ký tự của các chữ cái in hoa đều nhỏ hơn mã ký tự của các chữ cái in thường, điều này có nghĩa là có thể gặp các trường hợp sau:

var bResult = "Blue" < "alpha";
alert(bResult);	// Xuất true

Trong ví dụ trên, chuỗi "Blue" nhỏ hơn "alpha" vì mã ký tự của chữ B là 66, mã ký tự của chữ a là 97. Để có kết quả so sánh theo thứ tự alphabet thực sự, bạn phải chuyển hai số thành cùng hình thức viết hoa hoặc viết thường, sau đó so sánh:

var bResult = "Blue".toLowerCase() < "alpha".toLowerCase();
alert(bResult);	//Xuất ra false

Chuyển đổi cả hai toán tử thành chữ thường để đảm bảo nhận diện chính xác "alpha" đứng trước "Blue" trong thứ tự字母.

So sánh số và chuỗi

Một tình huống khó khăn khác xảy ra khi so sánh hai số dưới dạng chuỗi, ví dụ như:

var bResult = "25" < "3";
alert(bResult);	//Xuất ra "true"

Mã trên này so sánh chuỗi "25" và "3". Cả hai toán tử đều là chuỗi, vì vậy so sánh theo mã ký tự (mã ký tự của "2" là 50, mã ký tự của "3" là 51).

Nhưng nếu thay đổi một trong hai toán tử thành số, kết quả sẽ thú vị hơn:

var bResult = "25" < 3;
alert(bResult);	//Xuất ra "false"

Ở đây, chuỗi "25" sẽ được chuyển đổi thành số 25, sau đó so sánh với số 3, kết quả không出乎意料.

Bất kỳ khi nào so sánh một số với một chuỗi, ECMAScript sẽ chuyển đổi chuỗi thành số và so sánh theo thứ tự số.

Nhưng nếu chuỗi không thể chuyển đổi thành số thì sao? Hãy xem ví dụ sau:

var bResult = "a" < 3;
alert(bResult);

Bạn có thể dự đoán đoạn mã này sẽ xuất ra gì không? Ký tự "a" không thể chuyển đổi thành số có ý nghĩa. Tuy nhiên, nếu gọi phương thức parseInt() cho nó, sẽ trả về NaN. Theo quy tắc, bất kỳ toán tử mối quan hệ nào chứa NaN đều trả về false, vì vậy đoạn mã này cũng xuất ra false:

var bResult = "a" >= 3;
alert(bResult);

Thường thì, nếu hai giá trị của toán tử so sánh nhỏ hơn sẽ trả về false, thì toán tử lớn hơn hoặc bằng phải trả về true, nhưng nếu một số là NaN, tình hình lại không như vậy.