2010-05-19 32 views
32

Tôi chỉ đào bới một số mã JavaScript (Raphaël.js) và đi qua các dòng sau (dịch hơi):Math.min.apply (0, mảng) - tại sao?

Math.min.apply(0, x) 

nơi x là một mảng. Tại sao bạn lại làm điều này? Hành vi này có vẻ là "lấy phút từ mảng x".

+0

Math.min.apply (this, x) sẽ làm gì cũng – kennebec

Trả lời

31

Tôi nhận ra câu trả lời khi tôi đăng câu hỏi của riêng mình: cách gọn gàng nhất để lấy phút của mảng x bằng JavaScript. Đối số đầu tiên hoàn toàn tùy ý; Tôi tìm thấy 0 khó hiểu vì mã trực giác có nghĩa là "Lấy min của 0 và x," đó là hoàn toàn không phải là trường hợp. Sử dụng đối tượng Math có ý nghĩa hơn đối với khả năng đọc của con người, nhưng các tác giả Raphael.js bị ám ảnh bởi việc rút gọn và 0 là ngắn hơn ba byte.

Xem http://ejohn.org/blog/fast-javascript-maxmin/

Vì khả năng đọc, tôi rất muốn kêu gọi mọi người ngừng làm điều này và thay vào đó xác định một chức năng dọc theo dòng của

function arrayMin(arr) { return Math.min.apply(Math, arr); }; 
+12

Nó đáng chú ý là "0" trong mã Raphael đại diện cho phạm vi mà Math.min được thực hiện với. Lý do này "nên" là Toán là vì đó là phạm vi tự nhiên/nguyên gốc cho phương thức đó khi được gọi thông thường. Sử dụng zero có lẽ là tương đương với null ở đó, tương đương với đối tượng toàn cục (cửa sổ). Điều này làm việc tốt giả định rằng phương thức không cần truy cập vào trạng thái bên trong của đối tượng Math, mà có lẽ là một giả định an toàn, nhưng vẫn là một giả định. Không sử dụng mẫu đó nếu bạn có thể giúp. Như bạn (Trevor) lưu ý, sử dụng Toán học ở đó. –

+9

Chỉnh sửa ở trên: Sử dụng số không ở đây không tương đương với null. Đó là ngữ nghĩa ngốc nghếch, và kết quả trong phạm vi là một đối tượng Số đại diện cho số không, về cơ bản là vô giá trị. Điều này giúp nhân vật đếm đến mức tối thiểu, nhưng vẫn tạo ra một giả định về các hoạt động bên trong của "min". –

+1

Thu nhỏ? Đó có thực sự là một từ không? :) –

0

Dưới đây là một ví dụ, nơi chúng tôi có thể nhận được MAX và MIN thời gian bù tắt múi giờ cho một năm cho một múi giờ. Nó trả về hai thay đổi trong năm để tính cho DST và ST. (ví dụ: ST = 300 DST = 360 cho múi giờ được đề cập).

var arr = []; 
    for (var i = 0; i < 365; i++) { 
     var d = new Date(); 
     d.setDate(i); 
     var newoffset = d.getTimezoneOffset(); 
     arr.push(newoffset); 
    } 
    var DST = Math.min.apply(null, arr); 
    var nonDST = Math.max.apply(null, arr); 
    tw.local.stInt = DST 
    tw.local.edInt = nonDST 
+0

Bất cứ ai có thể cho tôi biết sự khác biệt giữa việc gọi Math.min.apply (null, arr) và Math.min.apply (Math, arr). Làm thế nào sẽ null gọi là bối cảnh làm việc với áp dụng? Ngữ cảnh gốc cho phương thức min là đối tượng Math và nó có ý nghĩa hơn khi sử dụng Math làm đối số đầu tiên cho phương thức áp dụng. – user1176058

3

Lý do là thế này:

  • đầu vào của bạn x là một mảng

  • Chữ ký của Math.min() không mất mảng, chỉ dấu phẩy tách ra lập luận

  • Nếu bạn đang sử dụng Function.prototype.call() nó sẽ có gần như cùng một chữ ký, ngoại trừ đối số đầu tiên là this bối cảnh, ví dụ ai "kêu gọi"

    • Ví dụ: Math.min.call(context, num1, num2, num3)
  • Các context chỉ quan trọng khi bạn tham khảo this bên trong hàm, ví dụ hầu hết các phương pháp bạn có thể gọi trên một mảng: Array.prototype.<method> sẽ tham chiếu đến this (mảng bên trái của dấu chấm) bên trong phương thức.

  • Function.prototype.apply() rất giống với .call(), chỉ thay vì lấy đối số được phân tách bằng dấu phẩy, bây giờ nó lấy mảng sau context.

    • Function.prototype.call(context, arg1, arg2, arg3)
    • Function.prototype.apply(context, [arg1, arg2, arg3])
  • Các 0 hoặc null mà bạn đưa vào như là đối số đầu tiên chỉ là một nơi shifter.

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