本文实例讲述了JS中apply()的应用。分享给大家供大家参考,具体如下:
先从Math.max()
函数说起,Math.max
后面可以接收任意个参数,最后返回所有参数中的最大值。
比如:
alert(Math.max(5,8));//8
alert(Math.max(5,7,3,1,9,2));//9
但是在很多情况下,我们需要找出数组中最大的元素。
比如:
/*
* 找出数组中最大的数
*/
var arr = [1,4,9,6];
//alert(Math.max(arr));//NaN,这种用法不对
function max(arr){
var arrLen = arr.length;
var maxValue = arr[0];
for(var i=0;i<arrLen;i++){
var maxValue = Math.max(maxValue,arr[i]);
}
return maxValue;
}
alert(max(arr));//9
上面的写法麻烦而且低效。我们用apply()
试试。
/*
* 用apply()找出数组中最大的数
*/
var arr = [1,4,9,6];
function getMax1(arr){
return Math.max.apply(Math,arr);//第一个参数也可以填this或null
}
alert(getMax1(arr));//9
这两段代码达到了相同的效果,但是getMax1()
却优雅,简洁,而且高效。
再比如数组的push方法。
/*
* 把两个数组整合成一个数组
*/
var arr1 = [1,3,4];
var arr2 = [6,7,8];
arr1.push(arr2);这样是不行的,得到的是[1,3,4,[6,7,8]]。因为push方法没有提供push一个数组,但是提供了push(param1,param2…),所以,如果push的参数是数组,它会将该数组作为单个元素添加,而不是将这个数组内的每个元素添加进去,因此我们最终会得到一个数组内的数组。
可以把arr2展开,然后一个一个追加(push)到arr1中去(当然也可以用 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);
console.log(arr1);//1,3,4,6,7,8
原理:arr1调用了push方法参数是通过apply将数组装换为参数列表的集合。
看到这里大家是不是心里想说:有必要这么麻烦吗(嫌弃的表情)js明明就有concat 这个强大的方法,concat() 方法用于连接两个或多个数组。该方法不会改变现有的数组,而仅仅会返回被连接数组的一个副本。如下
var arr1 = new Array('1','3','4');
var arr2 = new Array('6','7','8');
console.log(arr1.concat(arr2));//1,3,4,6,7,8
console.log(arr1);//1,3,4
console.log(arr2);//6,7,8
其实我想说如果真的需要数组链接的话当然要用concat啊,使用apply只是介绍一下可以这么用并不是只能这么用。