如果Math.max([1,3,9])返回错误(需要一个数字列表,而不是一个数组),为什么通过下面的应用调用它有效?
function getMaxOfArray(numArray) {
return Math.max.apply(null, numArray);
}
getMaxOfArray([1,3,9]) //9
getMaxOfArray(1,3,9) //error
我理解.apply传递一个数组,但是为什么max函数只有在通过apply调用时才能使用它们?是否有一些内部转换数组=>列表?
答案 0 :(得分:3)
apply
期望参数在数组中。如果您只是在第二种情况下使用参数列表,请使用call
代替
Math.max.apply(null,[1,3,9])
Math.max.call(null,1,3,9)
What is the difference between call and apply?详细介绍了call
和apply
答案 1 :(得分:2)
您的函数只接受一个参数(numArray
),而不是三个 - 这就是您对getMaxOfArray
的调用失败的原因。如果您正在编写单行代码,则应使用call
代替apply
来获取一系列参数而不是数组,如下所示:
Math.max.apply(null, [1, 3, 9]);
Math.max.call(null, 1, 3, 9);
对于函数,如果不希望用户传递数组,则可以将arguments
对象用于可变数量的参数。这是你如何以这种方式去做。 (请注意,我仍然在这里调用apply
,因为我将用户调用的所有参数存储到数组中。)
function getMaxOfArguments() {
var parameters = 1 <= arguments.length ? [].slice.call(arguments, 0) : [];
return Math.max.apply(null, parameters);
}
现在,你的第二个函数调用应该有效:
getMaxOfArguments(1, 3, 9); // 9
答案 2 :(得分:0)
Math.max的函数签名是函数(arg1,arg2,arg3,...)不是函数(Array)。 Apply将输入转换为Math.max的更可口的形式。