2011-07-13 45 views
20

Tại sao (1 < NaN) trả lại false và không undefined (bằng JavaScript)?Tại sao (1 <NaN) sai trong JavaScript?

Trong "11.8.5 Thuật toán so sánh tương quan trừu tượng", nó nói rằng nếu một trong hai giá trị là NaN (sau ToPrimitive và ToNumber không ảnh hưởng đến NaN theo quan điểm của tôi) thì kết quả là undefined.

Trong FF và Chrome tôi nhận được:

console.log(1 < NaN); 
// false 

Tại sao vậy?

+4

+1 để trích dẫn thông số trong câu hỏi. :-) – RobG

+3

Bạn chắc chắn nên xem xét sai/NaN/0/undefined/""/null vấn đề của Javascript. Đó là không phù hợp khủng khiếp và là một trong những lỗ hổng nghiêm trọng nhất của ngôn ngữ này (nếu không khá tốt). –

+0

@SF: Và nếu nó thực sự nghiêm ngặt, mọi người sẽ phàn nàn về * rằng * thay vào đó. :-) Các quy tắc không thực sự là tất cả những gì xấu, và trong thực tế ví dụ cụ thể này không có gì để làm với những điều sai/NaN/0/undefined/""/null. Đó là nhiều hơn rằng các đặc điểm kỹ thuật có phần này nói cách quan hệ làm việc, nhưng sau đó bạn phải tìm nơi khác để thấy rằng đã thực hiện công việc trong phần được trích dẫn, có nhiều hơn rằng các nhà điều hành thực tế không. –

Trả lời

15

Vì toán tử < trả về false khi thuật toán quan hệ trừu tượng trả về undefined. Xem Section 11.8.1:

11.8.1 Các Ít hơn Operator (<)

Các RelationalExpression sản xuất: RelationalExpression < ShiftExpression được đánh giá như sau:

  1. Hãy lref là kết quả của việc đánh giá RelationalExpression.
  2. Hãy để lval là GetValue (lref).
  3. Hãy để rref là kết quả của việc đánh giá ShiftExpression.
  4. Hãy để rval là GetValue (rref).
  5. Hãy để r là kết quả của việc thực hiện so sánh quan hệ trừu tượng lval < rval. (Xem 11.8.5)
  6. Nếu rkhông xác định, trở sai. Nếu không, hãy trả lại r.

Điều này đúng với tất cả các toán tử quan hệ. Thuật toán có kết quả undefined, nhưng các toán tử chuyển đổi thành false. Và điều đó có ý nghĩa. 1không phải là< NaN (cũng không phải là > NaN hoặc == NaN hoặc ... :-)).

(Rất vui khi thấy mọi người đọc thông số kỹ thuật.)

+0

Mục 11.8.5: http://es5.github.com/#x11.8.5 –

+0

Ah! Cảm ơn rất nhiều! – Sacha

Các vấn đề liên quan