2015-06-21 22 views
71

Khi đọc nguồn của D3.js tôi đã xem mẫu x >= x. Nếu nó là để phát hiện NaN trong số, tại sao không chỉ isNaN(x) hoặc x == x?x> = x mẫu trong JavaScript

Source, where I encountered it:

d3.min = function(array, f) { 
    var i = -1, n = array.length, a, b; 
    if (arguments.length === 1) { 
    while (++i < n) if ((b = array[i]) != null && b >= b) { 
     a = b; 
     break; 
    } 
    while (++i < n) if ((b = array[i]) != null && a > b) a = b; 
    } else { 
    while (++i < n) if ((b = f.call(array, array[i], i)) != null && b >= b) { 
     a = b; 
     break; 
    } 
    while (++i < n) if ((b = f.call(array, array[i], i)) != null && a > b) a = b; 
    } 
    return a; 
}; 
+14

Hãy nhìn vào các cam kết mà giới thiệu logic: https://github.com/mbostock/d3/commit/d8c8b5ddd6d433b7c80bc5e3e469fdf277c1aa16, https://github.com/mbostock/d3/commit/aad1b18865f8c73c4267c7505435070f42fa6c40 –

+0

@FelixKling Cảm ơn! Tôi đã thực sự tìm kiếm một số mã nguồn có chú thích, nhưng có vẻ như không có: [bản sao chú thích của mã nguồn d3.js như mã nguồn của jQuery?] (Http://stackoverflow.com/questions/10624927/annotated-copy- of-d3-js-source-code-like-the-one-for-jquery) –

Trả lời

79

Từ điều tra của tôi, d3.min được cho là hoạt động trên bất kỳ loại giá trị có thể đặt hàng nào, không chỉ số. isNaN sẽ chỉ hoạt động với số.

d3 thực sự đang sử dụng == tại một số thời điểm. This commit giới thiệu x == x kiểm tra:

Không giống như Math.minMath.max, nó không có ý nghĩa trở về vô cực âm hoặc dương tính với d3.mind3.max; các hàm D3 trả về giá trị nhỏ nhất theo thứ tự tùy ý, không phải bằng giá trị số. Thay vào đó, tối thiểu hoặc tối đa của một mảng trống, hoặc một mảng chỉ chứa các giá trị thoái hóa, nên luôn luôn không được xác định.

This commit thay đổi x == x để x <= x (mà sau này được đổi lại thành x >= x):

Ngoài NaN, mà không phải là tương đương với bản thân, bạn có thể có các đối tượng mà không phải là orderable do định nghĩa Hàm valueOf trả về NaN. Ví dụ:

var o = new Number(NaN); 

Ở đây, o == o là đúng, nhưng o <= o là sai. Do đó, có thể cho d3.min, d3.max và d3.extent để quan sát các giá trị không thể đặt hàng này thay vì bỏ qua chúng như dự định. Bản sửa lỗi là để kiểm tra !(o <= o) thay vì o == o.

+45

+1 trùng hợp, '! (O <= o)' là khuôn mặt của tôi trông như thế nào khi tôi cố gắng hiểu các quy tắc bình đẳng '==' của Javascript. – user568458

8

OK, tôi thấy rằng x >= x cho false cho cả NaNundefined. (Không giống như isNaN(x) hoặc x == x.)

EDIT: Trong khi nó là một trong những trường hợp sử dụng của x >= x, trong trường hợp này (thx @Felix Kling cho trỏ này ra) undefined đang được kiểm tra.

+5

Tuy nhiên, trường hợp 'undefined' đã được bảo vệ bằng'! = null'. –