2011-09-15 3 views
1

문자열이나 배열 (또는 길이 속성이 다른 것) 반복, 난 항상 이런 루프를 사용했습니다 :JavaScript에서는 문자열/배열 .length 속성이 처리를 수행합니까?

var foo = [...]; 
var fooLen = foo.length; 
var i; 
for(i=0; i<fooLen; i++) { 
    // do something 
} 
그러나

var foo = [...]; 
var i; 
for(i=0; i<foo.length; i++) { 
    // do something 
} 

을, 난 그냥 이런 짓을 누군가가 발생

그는 ".length"가 길이를 다시 계산한다고 생각하여 루프는 문자열/배열의 길이를 계속해서 다시 계산할 것이므로 길이를 변수에 저장하면 더욱 최적화됩니다.

길이가 사용 된 방식 (길이가 "asdf".length()이 아닌, "asdf".length)으로 인해 항상 값 속성이라고 가정했는데이 경우가 아닙니까?

+3

관련 정보 : http://stackoverflow.com/questions/5752906/is-reading-the-length-property-of-an-array-really-that-expensive-an-operation-i – user113716

+1

' for (var i = 0, len = foo.length; i nnnnnn

+0

부수적으로, 속성이 구문 적으로 함수로 사용되지 않았다고해서 그것이 동적이지 않다는 것을 의미하지는 않습니다. 가장 불명예스러운 것은'innerHtml'입니다.이 HTML은 값으로 취급되지만 실제로 할당 된 경우 브라우저의 HTML 컴파일러를 호출합니다. – slebetman

답변

3

가 지역 변수로 길이를 두는 것은 .length 속성에 액세스보다 빠릅니다 상황이하고 브라우저에 따라 다릅니다. SO 및 수많은 jsperf 테스트에 대한 성능 토론이 여기에 있습니다. 현대적인 브라우저에서, 그 차이는 내가 생각한 것만 큼 많지는 않았지만 어떤 경우에는 존재합니다 (이전 스레드를 찾을 수없는 것 같습니다).

성능 특성이 다른 여러 유형의 개체가 있습니다. 예를 들어, 자바 스크립트 배열은 getElementsByClassName()과 같은 일부 DOM 함수에서 반환 된 배열 형 객체와 다른 성능 특성을 가질 수 있습니다.

그리고 배열 끝 부분에 항목을 추가하는 경우가 있으며 상황을 추가하기 전에 반복해서 반복하지 않으므로 시작하기 전에 길이를 얻을 수 있습니다.

0

"일반"배열과의 차이는별로 없겠지만 "node.children.length"와 같은 경우에는 안전 측면에서 잘못되어 한 번만 호출합니다. CoffeeScript가 자동으로 처리합니다.

루프 중에 길이가 변경 될 수있는 경우 실제 동작에 차이가 있음에 유의하십시오. 한 번 길이 속성 모든 루프를 찾고으로

1

for (var i = 0; i < a.length; i++) { 
    // Do something with a[i] 
} 

MDC에서이 약간 비효율적이다. 개선은 이것이다 :

for (var i = 0, len = a.length; i < len; i++) { 
    // Do something with a[i] 
} 
0

foo의 길이를 변경하는 경우에 따라 다릅니다.

var foo = [1,2,3]; 
    while(foo.length){ 
    foo.shift(); 
} 

명백하게 코드는 단순히 값을 기억하는 것이 아니라 foo의 길이를 추적합니다.

길이를 루프의 번호로 지정할 수 있습니다.

for(i=0, L=foo.length;i<L; i++) { 
    // do something to foo[i] 
} 
관련 문제