1. 이전 버전과의 호환성
JavaScript는 ECMAScript 의 구현입니다 . 이러한 기능의 대부분은 ECMAScript 5 (ES5)에 도입되었지만 여전히 시장 점유율이 상당히 높은 많은 구형 브라우저는 이러한 기능을 지원하지 않습니다 ( ECMAScript 5 호환성 표 참조 ).
일반적으로 라이브러리는 고유 한 폴리 필을 사용하는 경우 기본 구현으로 되돌아갑니다 (예 : AngularJS의 구현 ( angular.js L203-257 ) 참조 ).
function forEach(obj, iterator, context) {
var key;
if (obj) {
if (isFunction(obj)){
for (key in obj) {
// Need to check if hasOwnProperty exists,
// as on IE8 the result of querySelectorAll is an object without a hasOwnProperty function
if (key != 'prototype' && key != 'length' && key != 'name' && (!obj.hasOwnProperty || obj.hasOwnProperty(key))) {
iterator.call(context, obj[key], key);
}
}
} else if (obj.forEach && obj.forEach !== forEach) {
obj.forEach(iterator, context);
} else if (isArrayLike(obj)) {
for (key = 0; key < obj.length; key++)
iterator.call(context, obj[key], key);
} else {
for (key in obj) {
if (obj.hasOwnProperty(key)) {
iterator.call(context, obj[key], key);
}
}
}
}
return obj;
}
다음 행은 forEach
메소드가 오브젝트에 존재하는지 여부와 AngularJS 버전인지 여부를 확인합니다. 그렇지 않은 경우 이미 지정된 기능 (기본 버전)을 사용합니다.
} else if (obj.forEach && obj.forEach !== forEach) {
obj.forEach(iterator, context);
}
2. 편의
네이티브 JavaScript Array.prototype.forEach
에서의 인스턴스 전용 메소드 Array
이지만 대부분 의 클래스 Object
도 반복 가능합니다.
이러한 이유로 많은 라이브러리 제작자는 함수를 다형성으로 만듭니다 (여러 유형을 입력으로 받아 들일 수 있음). 위의 AngularJS 코드를 가져 와서 어떤 입력을 받아들이는지 봅시다 :
기능 :
if (isFunction(obj)){
for (key in obj) {
// Need to check if hasOwnProperty exists,
// as on IE8 the result of querySelectorAll is an object without a hasOwnProperty function
if (key != 'prototype' && key != 'length' && key != 'name' && (!obj.hasOwnProperty || obj.hasOwnProperty(key))) {
iterator.call(context, obj[key], key);
}
}
배열 (각각 forEach 지원) :
} else if (obj.forEach && obj.forEach !== forEach) {
obj.forEach(iterator, context);
Array (기본적으로 forEach를 지원하지 않음), String, HTMLElement, 유효한 길이 속성을 가진 Object를 포함한 배열 과 유사한 객체 :
} else if (isArrayLike(obj)) {
for (key = 0; key < obj.length; key++)
iterator.call(context, obj[key], key);
사물:
} else {
for (key in obj) {
if (obj.hasOwnProperty(key)) {
iterator.call(context, obj[key], key);
}
}
}
결론
보시다시피 AngularJS는 대부분의 JavaScript 객체를 반복하지만 기본 함수와 동일한 방식으로 작동하지만 훨씬 더 다양한 유형의 입력을 허용하므로 라이브러리에 유효한 추가 기능뿐만 아니라 ES5 함수를 가져 오는 방법입니다 레거시 브라우저로