使用 Javascript math.max.apply(null 或 math..)
use of Javascript math.max.apply(null or math..)
第一个例子
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)
吗,有什么不同吗?
上面第二个,null这个参数让我很迷惑,而且max mehood好像需要数字类型,而不是数组?
您将添加第二个数组作为第一个 ([a,b,[c,d]]) 的值。如果你想合并两个数组,我建议你调用 .concat 而不是
"apply" 和 "call" 中的第一个参数定义调用函数时使用的上下文:"this"。对于 math.max,上下文并不重要,因此上下文可以为空,您也可以传递 Math,我认为这在语义上更正确。不过在这种情况下没关系
第一个例子
array1.push(array2)
array1
变为 ['a', 'b', ['c', 'd']]
第二个例子
看thefoureye的解释here
即:
There is another advantage, of using apply, you can choose your own
context. The first parameter, you pass to apply of any function, will
be the this inside that function. But, max doesn't depend on the
current context. So, anything would work in-place of Math.
如果使用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
是一个常见的占位符。但是当我们使用 apply
调用 push
时,我们必须将 arr1
作为上下文传递,因此它知道要修改哪个数组。有些人喜欢写
Math.max.apply(Math, [-1, 5, 11, 3]);
这样上下文就如同您以正常方式调用 Math.max
一样。但在这种情况下并不重要。
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 > Tools > Web Developer > Web Console 来检查我的答案。
第一个例子
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)
吗,有什么不同吗?
上面第二个,null这个参数让我很迷惑,而且max mehood好像需要数字类型,而不是数组?
您将添加第二个数组作为第一个 ([a,b,[c,d]]) 的值。如果你想合并两个数组,我建议你调用 .concat 而不是
"apply" 和 "call" 中的第一个参数定义调用函数时使用的上下文:"this"。对于 math.max,上下文并不重要,因此上下文可以为空,您也可以传递 Math,我认为这在语义上更正确。不过在这种情况下没关系
第一个例子
array1.push(array2)
array1
变为 ['a', 'b', ['c', 'd']]
第二个例子
看thefoureye的解释here
即:
There is another advantage, of using apply, you can choose your own context. The first parameter, you pass to apply of any function, will be the this inside that function. But, max doesn't depend on the current context. So, anything would work in-place of Math.
如果使用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
是一个常见的占位符。但是当我们使用 apply
调用 push
时,我们必须将 arr1
作为上下文传递,因此它知道要修改哪个数组。有些人喜欢写
Math.max.apply(Math, [-1, 5, 11, 3]);
这样上下文就如同您以正常方式调用 Math.max
一样。但在这种情况下并不重要。
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 > Tools > Web Developer > Web Console 来检查我的答案。