프로그램 성능을 향상시키는 Function.apply()의 기술에 대해 이야기해 보겠습니다.
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
function getMax2(arr){
return Math.max.apply(null, arr)
}
두 코드 조각은 동일한 목적을 달성합니다. 그러나 getMax2 우아하고 효율적이며 훨씬 간단합니다.
성능 테스트 보기:
<script></font>var myArr=new Array()</p>
<p>
<font face="Verdana"><br>function fillRnd(arrLen){ //1부터 10까지의 arrLen 난수를 배열에 채웁니다</font> for(var i=0,arr=[];i<arrLen;i ){</P> arr[i]=Math.ceil(Math.random()*10)<P> }<FONT face=Verdana> arr 반환<BR>}<BR><BR>
<BR><BR>function getMax(arr){</FONT> var arrLen=arr.length;</P> for(var i=0,ret=arr[0];i<arrLen;i ){<P> ret =Math.max(ret,arr[i]);
<FONT face=Verdana><BR>function getMax2(arr){<BR> return Math.max.apply(null,arr)<BR>}<BR><BR><BR>
</FONT></P>myArr=fillRnd(20*10000) //200,000개의 난수를 생성하여 배열을 채웁니다<P>
<FONT face=Verdana>var t1=new Date()<BR>var max1=getMax(myArr)<BR>var t2=new Date()</FONT>var max2=getMax2(myArr)</P>var t3=new Date() <FONT face=Verdana>
<P>if (max1!==max2) Alert("error")<BR>alert([t3-t2,t2-t1]) //96,464 내 컴퓨터에서는 다른 결과가 나타날 수 있습니다</P>
<P></script>
200,000개의 데이터를 비교하면 getMax2 시간은 96ms, getmax 시간은 464입니다. 둘의 차이는 5배
또 다른 예는 배열의 푸시 방법입니다.
var arr1=[1,3,4];
arr2를 확장하려면 arr1에 하나씩 추가하고 마지막으로 arr1을 =[1,3,4,3,4,5]
arr1.push(arr2) 분명히 작동하지 않습니다. 이렇게 하면 [1,3,4, [3,4,5] ]를 얻게 됩니다.
루프를 사용하여 하나씩 푸시할 수만 있습니다(물론 arr1.concat(arr2)를 사용할 수도 있지만 concat 메서드는 arr1 자체를 변경하지 않습니다)
for (var i =0;i
}
Apply가 있어서 일이 너무 단순해졌습니다