2012-05-08 2 views
0
/* 
* Example function for operating with dynamic arguments 
*/ 
function something(){ 
    for(var i in arguments){ 
     arguments[i] = arguments[i] + Math.random() * 25; 
    } 

    return arguments; 
} 

오류가없고 성능 저하가 나타나지 않으며 값이 변경됩니다.동적 인수를 사용하여 작동하고 반환하는 것이 안전합니까?

따라서 동적 인수에서 이러한 연산을 수행하는 것이 안전합니까?

답변

3

실제 배열이 아니기 때문에 결코 반환하지 않을 것입니다 (해당 객체의 특수한 동작에 대한 정보는 http://javascriptweblog.wordpress.com/2011/01/18/javascripts-arguments-object-and-beyond/ 참조). 따라서 호출 코드가 무엇을하는지에 따라 실패합니다.

그러나, 당신은 쉽게 배열으로 바꿀 수 있습니다 변화도 함수가 어떤을 받아들이는 경우에 해당 명명 된 인수를 변경 이후 원래 객체를 수정하지 않을

var args = Array.prototype.slice.call(arguments); 

.

0

arguments은 "의사 배열"입니다. 배열을 반환하는 것과 어떻게 다릅니 까? 유일한 단점은 arguments이 배열이 아니므로 필요한 배열 속성과 메서드가 없다는 것입니다.

0

예, 안전합니다. 그렇지만 arguments 개체의 기능에주의해야합니다.이 개체는 Ecmascript 구현과 버전에 따라 다릅니다. 인수 변수에 절대적으로 링크 된 의사 배열 일 수도 있지만 독립 Array 인스턴스 일 수도 있습니다.

당신이 그것을 확인의 환경을 알고 있다면, 그것은 코드

function something() { 
    var l = arguments.length, 
     res = new Array(l); 
    for(var i=0; i<l; i++) { 
     res[i] = arguments[i] + Math.random() * 25; 
    } 
    return res; 
} 
+0

이러한 경우에 ThiefMasters 변형을 사용하는 것이 좋을 것에 더 나은 elsewhile. – jolt

+0

어쨌든이 값이 필요하지 않은데 왜 슬라이스를 사용하여 복사합니까? http://jsperf.com/slice-vs-create – Bergi

+0

그러나 새 배열을 만들고이 값을 동적으로 추가하는 것은 루프 내부를 제외하고 슬라이스와 동일합니다. 허, jsperf 링크를 알아 차리지 못했습니다 ... 흥미 롭습니다. 모든 브라우저에서 더 빨라지겠습니까? – jolt

관련 문제