第一个例子
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)
,有什么不同吗?
在上面的第二个中,空参数确实让我感到困惑,而且更多的是,似乎最大限度需要数字类型,而不是数组?
答案 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)
。
f
为arr1.push
,x
为arr1
,y
为arr2
,
那个arr1.push.apply(arr1, arr2)
是arr1.push(the contents of arr2)
。
注意,arr1.push
将其所有参数添加到arr1
,因此arr1.push(arr2)
将arr2
添加到arr1
,使其成为['a', 'b', ['c', 'd']]
。
其中f
为Math.max
,y
为[-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)
您将第二个数组添加为第一个数组的值([a,b,[c,d]])。如果您想要合并两个数组,我建议您拨打.concat而不是
"中的第一个参数;"并且"打电话"定义调用函数时使用的上下文:" this"。对于math.max,上下文并不重要,因此上下文可以为null,您也可以传递Math,在我看来,这在语义上更正确。但在这种情况下无关紧要
答案 3 :(得分:0)
第一个例子
array1.push(array2)
array1
变为['a', 'b', ['c', 'd']]
第二个例子
请参阅thefoureye的解释here
即:
使用apply还有另一个优点,你可以选择自己的 上下文。第一个参数,你传递给任何函数的应用,将 成为这个功能的内部。但是,max并不依赖于 目前的背景。所以,任何东西都可以代替数学。