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. ความสะดวกสบาย
ในภาษาจาวาสคริปต์Array.prototype.forEach
นั้นเป็นวิธีการเฉพาะสำหรับอินสแตนซ์Array
อย่างไรก็ตามส่วนใหญ่ใด ๆObject
iterable เกินไป
ด้วยเหตุนี้ผู้สร้างห้องสมุดจำนวนมากจึงทำหน้าที่หลากหลาย (สามารถรับได้หลายประเภทเป็นอินพุต) ลองดูโค้ด 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);
}
}
อาร์เรย์ (พร้อมการสนับสนุนพื้นเมืองสำหรับแต่ละคน):
} else if (obj.forEach && obj.forEach !== forEach) {
obj.forEach(iterator, context);
Array-like objectsรวมถึง Array (ที่ไม่มีการสนับสนุนสำหรับแต่ละภาษา), 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 สู่เบราว์เซอร์รุ่นเก่า