我们先从Math.max()函数说起,Math.max后面可以接任意个参数,最后返回所有参数中的最大值。
比如
alert(Math.max(5,8)) //8
alert(Math.max(5,7,9,3,1,6)) //9
但是在很多情况下,我们需要找出数组中最大的元素。
var arr=[5,7,9,1] alert(Math.max(arr)) // 这样却是不行的。一定要这样写 function getMax(arr){ var arrLen=arr.length; for(var i=0,ret=arr[0];i<arrLen;i++){ ret=Math.max(ret,arr[i]); } return ret; }
这样写麻烦而且低效。如果用 apply呢,看代码:
function getMax2(arr){ return Math.max.apply(null,arr); }
两段代码达到了同样的目的,但是getMax2却优雅,高效,简洁得多。
再比如数组的push方法。
var arr1=[1,3,4];
var arr2=[3,4,5];
如果我们要把 arr2展开,然后一个一个追加到arr1中去,最后让arr1=[1,3,4,3,4,5]
arr1.push(arr2)显然是不行的。 因为这样做会得到[1,3,4,[3,4,5]]
我们只能用一个循环去一个一个的push(当然也可以用arr1.concat(arr2),但是concat方法并不改变arr1本身)
var arrLen=arr2.length for(var i=0;i<arrLen;i++){ arr1.push(arr2[i]); }
自从有了Apply,事情就变得如此简单
Array.prototype.push.apply(arr1,arr2)
*--------------------------------------------------我的分割线--------------------------------------------------*
我的理解说明:
1.先说Math.max()
Math.max(1,2,3,4,5)
Math.max.apply(null,[1,2,3,4,5]);
apply方法能把第二个参数(一个数组),把数组中的n个值,作为n个参数,一起传给应用apply的函数方法.
而这里的null,是因为Math.max函数是一个全局函数.此处不需要改变this指向.
2.再说arr1.push(arr2)
push是所有Array的原型方法,当对arr1应用时,this就指向了arr1.所以使用apply时,将第一个参数设置为arr1,第二个参数arr2将会变为n个参数,一并传给push();
我也可以不用Array.prototype.push,而直接使用: arr1.push.apply(arr1,arr2).也可以达到同样的效果.