[javascript] ~에 대한 JavaScript

for … in과 for 루프에 큰 차이가 있다고 생각하십니까? 어떤 종류의 “사용”을 선호하고 그 이유는 무엇입니까?

연관 배열의 배열이 있다고 가정 해 봅시다.

var myArray = [{'key': 'value'}, {'key': 'value1'}];

따라서 반복 할 수 있습니다.

for (var i = 0; i < myArray.length; i++)

과:

for (var i in myArray)

큰 차이는 보이지 않습니다. 성능 문제가 있습니까?



답변

선택은 관용구가 가장 잘 이해되는 것을 기반으로해야합니다.

배열은 다음을 사용하여 반복됩니다.

for (var i = 0; i < a.length; i++)
   //do stuff with a[i]

연관 배열로 사용되는 객체는 다음을 사용하여 반복됩니다.

for (var key in o)
  //do stuff with o[key]

지구가 산산이 부서지지 않는 한, 정해진 사용 패턴을 고수하십시오.


답변

Douglas Crockford 는 명령문 사용을 피하기 위해 JavaScript : Good Part (24 페이지)에서 권장 for in합니다.

for in객체에서 속성 이름을 반복 하는 데 사용 하면 결과가 정렬되지 않습니다. 최악의 결과 : 예기치 않은 결과가 발생할 수 있습니다. 여기에는 프로토 타입 체인에서 상속 된 멤버 및 메소드 이름이 포함됩니다.

속성을 제외한 모든 것을로 필터링 할 수 있습니다 .hasOwnProperty. 이 코드 샘플은 원래 원하는 것을 수행합니다.

for (var name in obj) {
    if (Object.prototype.hasOwnProperty.call(obj, name)) {
        // DO STUFF
    }
}


답변

참고-jQuery 사용자


jQuery의 each(callback)메소드는 for( ; ; )기본적으로 루프를 사용 하며 길이가 인 경우 for( in ) 에만 사용 합니다undefined .

따라서이 기능을 사용할 때 올바른 순서를 취하는 것이 안전하다고 말하고 싶습니다.

:

$(['a','b','c']).each(function() {
    alert(this);
});
//Outputs "a" then "b" then "c"

이것을 사용하는 단점은 UI 이외의 논리를 수행하면 함수가 다른 프레임 워크보다 이식성이 떨어집니다. 이 each()기능은 jQuery 선택기와 함께 사용하기에 가장 적합 for( ; ; )하며 그렇지 않은 경우 권장됩니다.



답변

사용하는 루프 종류와 브라우저에 따라 성능 차이가 있습니다.

예를 들어 :

for (var i = myArray.length-1; i >= 0; i--)

일부 브라우저에서 다음보다 두 배 빠릅니다.

for (var i = 0; i < myArray.length; i++)

그러나 배열이 거대하거나 지속적으로 반복하지 않으면 모든 것이 충분히 빠릅니다. 배열 루핑이 프로젝트 (또는 그 문제에 대한 다른 프로젝트)의 병목 현상이라고 의심합니다.


답변

네이티브 Array.forEach 메소드는 현재 폭넓게 지원되고 있습니다.


답변

Chrome, Firefox, IE9, Safari 및 Opera는 모든 주요 브라우저의 2012 현재 버전에 대한 답변이 ES5의 기본 배열을 지원합니다.

IE8을 기본적으로 지원할 이유가없는 한 (적절한 JS 환경을 제공하는 ES5-shim 또는 Chrome 프레임을 이러한 사용자에게 제공 할 수 있음을 명심하십시오) 언어의 적절한 구문을 사용하는 것이 더 깨끗합니다.

myArray.forEach(function(item, index) {
    console.log(item, index);
});

array.forEach ()에 대한 전체 설명서는 MDN에 있습니다.


답변

배열이 드문 경우 두 개는 동일하지 않습니다.

var array = [0, 1, 2, , , 5];

for (var k in array) {
  // Not guaranteed by the language spec to iterate in order.
  alert(k);  // Outputs 0, 1, 2, 5.
  // Behavior when loop body adds to the array is unclear.
}

for (var i = 0; i < array.length; ++i) {
  // Iterates in order.
  // i is a number, not a string.
  alert(i);  // Outputs 0, 1, 2, 3, 4, 5
  // Behavior when loop body modifies array is clearer.
}