使用Javascript math.max.apply(null或math ..)

时间:2016-01-29 02:31:13

标签: javascript apply

第一个例子

var arr1 = ['a', 'b'];
var arr2 = ['c', 'd'];

arr1.push.apply(arr1, arr2);
    // arr1 is now ['a', 'b', 'c', 'd']

第二个例子

Math.max.apply(null, [-1, 5, 11, 3])

在上面的第一个中,我们可以只使用array1.push(array2),有什么不同吗?

在上面的第二个中,空参数确实让我感到困惑,而且更多的是,似乎最大限度需要数字类型,而不是数组?

4 个答案:

答案 0 :(得分:2)

如果您使用arr1.push(arr2),结果会有所不同:

['a', 'b', ['c', 'd']]

要获得与原始arr1.push.apply相同的结果,您必须执行

arr1.concat(arr2);

apply获取数组参数,并将每个元素转换为被调用函数的单独参数。当你正常调用函数时,数组只是一个参数。

调用Math.max的正常方法是将它作为单独参数进行比较的每个数字:

Math.max(-1, 5, 11, 3);

为了从数组中获取参数,您必须使用apply来传播它们。

在第二种情况下null参数的原因是因为apply的第一个参数是函数的 context ,即将分配的值到函数内的this。正常调用函数时,上下文是.之前的值;例如,当你写

arr1.push('x');

上下文是arr1数组。 Math.max()不使用其上下文,但您必须传递一些内容,因此null是一个常见的占位符。但是当我们使用push调用apply时,我们必须传递arr1作为上下文,因此它知道要修改哪个数组。有些人喜欢写

Math.max.apply(Math, [-1, 5, 11, 3]);

这样上下文就像你以正常方式调用Math.max一样。但在这种情况下并不重要。

答案 1 :(得分:1)

f.apply(x, y) x.f(的内容为y)

farr1.pushxarr1yarr2, 那个arr1.push.apply(arr1, arr2)arr1.push(the contents of arr2)

注意,arr1.push将其所有参数添加到arr1,因此arr1.push(arr2)arr2添加到arr1,使其成为['a', 'b', ['c', 'd']]

其中fMath.maxy[-1, 5, 11, 3], 这是Math.max.apply(x, [-1, 5, 11, 3])

但是你在x放了什么?

Math.max可以作为自己调用的函数工作,而不是作为对象的方法。

如果您遗漏x并执行Math.max.apply([-1, 5, 11, 3])Math.max会认为它被称为数组的方法而没有任何参数。 所以它会给出Math.max()的结果。

那么你必须在x中添加一些东西,并不重要,因为Math.max没有使用它,所以它会忽略它。

您可以提供x的最佳价值是最简单的,null

如果你想知道一行Javascript代码会做什么,那么测试它是个好主意。

Firefox和Chrome都有一个你可以使用的内置Javascript命令行,还有一些网站也可以使用Javascript命令行。 我用的是Firefox>工具> Web开发人员> Web控制台检查我的答案。

答案 2 :(得分:0)

  1. 您将第二个数组添加为第一个数组的值([a,b,[c,d]])。如果您想要合并两个数组,我建议您拨打.concat而不是

  2. "中的第一个参数;"并且"打电话"定义调用函数时使用的上下文:" this"。对于math.max,上下文并不重要,因此上下文可以为null,您也可以传递Math,在我看来,这在语义上更正确。但在这种情况下无关紧要

答案 3 :(得分:0)

第一个例子

array1.push(array2)

array1变为['a', 'b', ['c', 'd']]

第二个例子

请参阅thefoureye的解释here

即:

  

使用apply还有另一个优点,你可以选择自己的   上下文。第一个参数,你传递给任何函数的应用,将   成为这个功能的内部。但是,max并不依赖于   目前的背景。所以,任何东西都可以代替数学。