3
function multiMax(multi){
// Make an array of all but the first argument
var allButFirst = Array().slice.call( arguments, 1 );

// Find the largest number in that array of arguments
var largestAllButFirst = Math.max.apply( Math, allButFirst );

// Return the multiplied result
return multi * largestAllButFirst;
}
assert( multiMax(3, 1, 2, 3) == 9, "3*3=9 (First arg, by largest.)" );

来自http://ejohn.org/apps/learn/#47

我有两个问题要问任何人。

  1. 为什么我们需要使用 Array().slice,而不是 Math().max。
  2. 为什么我们使用 Array().slice,而不是 Array.prototype.slice(我注意到 Array.prototype.slice 会起作用,但我试图理解为什么我会使用一个而不是另一个,而不仅仅是在这种情况下,但在任何情况下)

谢谢你。

4

2 回答 2

2

为什么我们需要使用 Array().slice,而不是 Math().max?

Array()用于代替的原因Array.prototype是因为在此特定情况下,一个是另一个的简写。

首先:与它们Array().slice.call(arguments, 1);具有相同的效果[].slice.call(arguments, 1);

因此,要回答您的第一个问题,他们“不需要”在那里使用它。它只是由于偏好而在那里使用。Array.prototype.slice.call(arguments, 1);or[].slice.call(arguments, 1);可以被替换,并且该功能仍然按预期工作。

至于Math.max.apply(Math, allButFirst);,Math不是一个“类” Array,因为Math它不能实例化对象(试试看)。由于它不能被实例化,它的语法访问或操作方式与Array()/不同[]

那也应该回答你的第二个问题。

正如 bmceldowney 所说,通常不会调用没有new关键字的构造函数。虽然合法,但我(个人)看到这让我很恼火,而且我也不认为这是现实生活中的好习惯。

于 2013-03-21T06:46:39.387 回答
1

我最好的镜头:

  1. Array() 将返回一个空数组实例,而 Array 只是一个构造函数。Array.slice 不起作用,因为 .slice 方法仅存在于数组实例上,通过它们的原型。Math 不是构造函数,它是一个具有许多实用方法的对象,其中一个是 max。

  2. 除了简洁之外,我不确定 Array().slice 和 Array.prototype.slice 之间是否存在很大差异,您发布的代码似乎对此非常重视。

您通常不会看到故意在没有“new”关键字的情况下调用构造函数,我认为这不是很好的做法。这绝对是聪明的代码,这通常意味着不太可维护。

于 2013-03-21T06:46:06.387 回答