2010-11-29 4 views
1

임,하지만 난 궁금 일이 : 나는 그것을 생각 http://ejohn.org/apps/learn/#43존 레식 고급 자바 스크립트 질문 내 머리에 약간의

function highest(){ 
    return arguments.slice(1).sort(function(a,b){ 
    return b - a; 
    }); 
} 
assert(highest(1, 1, 2, 3)[0] == 3, "Get the highest value."); 
assert(highest(3, 1, 2, 3, 4, 5)[1] == 4, "Verify the results."); 

:

에서 촬영 해야한다 :

Array.prototype.highest = function(){ 
    return arguments.slice(1).sort(function(a,b){ 
    return b - a; 
    }); 
} 
assert(highest(1, 1, 2, 3)[0] == 1, "Get the highest value."); 
assert(highest(3, 1, 2, 3, 4, 5)[1] == 1, "Verify the results."); 

그러나 이것은 나에게 정의의 오류를주고있다.

+1

, 잘못은 왜'highest' 첫 번째 매개 변수를 무시하는 Math.max –

답변

6

배열에서 호출하지 않습니다.

assert([].highest(1, 1, 2, 3)[0] == 1, "Get the highest value."); 
assert([].highest(3, 1, 2, 3, 4, 5)[1] == 1, "Verify the results."); 

([]은 모든 배열이 될 수 있음). 그러나 arguments을 배열로 변환하지 않았거나 slicecall 또는 apply으로 호출하지 않았습니다. 그것이 바로 운동의 요점입니다.

또한 배열의 내용을 사용하지 않으므로 아무런 의미가 없습니다.

따라서, 솔루션입니다 :

function highest(){ 
    return Array.prototype.slice.call(arguments, 1).sort(function(a,b){ 
    return b - a; 
    }); 
} 
+1

을 개혁인가? –

+1

@Crescent, 그것이 원래 튜토리얼에있는 방법입니다. 나는 그것이 단지'조각'의 예라고 생각합니다. –

2

모든 배열하는 방법을 추가하여 작업 할 함수를 정의하는 방법 : 원래의 기능을 의미

[1,2,3].highest() 

호출 할 정규 함수로 :

어쨌든 원본 코드의 문제는 지혜가 없습니다. 이거. 문제는 arguments이 실제로 배열이 아니므로 slice을 호출하기 전에 Array.prototype.slice.call(arguments)을 사용하여 변환해야한다는 것입니다.

정답은 : 사실에

function highest(){ 
    return Array.prototype.slice.call(arguments).slice(1).sort(function(a,b){ 
    return b - a; 
    }); 
} 
+1

예, 당신은 절대적으로 옳습니다! 나는 같은 것을 쓰고 싶다 ... "인자"는 "배열"이 아니므로 "슬라이스"라는 메소드가 없다. 그래서 변환이 필요하다. – Zango