2011-07-25 22 views
11

thể trùng lặp:
How to use Math.max, etc. as higher-order functionsTại sao tôi không thể viết [1,2,3] .reduce (Math.max) bằng Javascript?

Sử dụng Javascript 1.6 mảng của Mozilla 'mở rộng' chức năng (bản đồ, giảm, lọc vv), tại sao nó rằng các công việc sau như mong đợi:

var max = [1,2,3].reduce(function(a,b) { return Math.max(a,b); }); 

Nhưng các mục sau không hoạt động (nó tạo NaN):

var max2 = [1,2,3].reduce(Math.max); 

Có phải vì Math.max là hàm variadic không?

+3

Không hoàn toàn về chủ đề, nhưng nếu bạn muốn một cách dễ dàng giảm một mảng giá trị tối đa của nó, bạn có thể sử dụng '.apply()' trên 'Math.max'. 'var max = Math.max.apply (null, [1,2,3,4]);' – user113716

Trả lời

12

Math.max không biết phải làm gì với tất cả các biến phụ function(previousValue, currentValue, index, array) chủ yếu là mảng ở cuối.

[].reduce.call([1,2,3,6],function(a,b) { return Math.max(a,b); }); 

này hoạt động và sử dụng .call

+1

Chờ đã, tôi hiểu ... Tôi quên có các tham số 'extra' được truyền vào hàm được truyền để giảm. Vì vậy, tối đa là cố gắng tìm tối đa trên các thông số bổ sung là tốt. – sacheie

+0

bên phải và 'Math.max (1, [1,2,3])' là 'NaN' – Joe

+4

Tại sao bạn sử dụng .call() nếu bạn định chuyển mảng thành giá trị' this'? Đó chỉ là một cách quá phức tạp để làm những gì OP đã thể hiện trong câu hỏi. – nnnnnn

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