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);
});
답변
배열이 드문 경우 두 개는 동일하지 않습니다.
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.
}