1. Tương thích ngược
JavaScript là một triển khai của ECMAScript . Hầu hết các chức năng đó được giới thiệu trong ECMAScript 5 (ES5) tuy nhiên nhiều trình duyệt cũ hơn vẫn có thị phần đủ đáng kể không hỗ trợ các chức năng này (xem bảng tương thích ECMAScript 5 ), đáng chú ý nhất trong số này là IE8.
Nói chung, các thư viện sẽ trở lại triển khai gốc nếu nó tồn tại nếu không sử dụng polyfill của riêng họ, ví dụ: hãy xem triển khai của 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;
}
Các dòng sau kiểm tra xem forEach
phương thức có tồn tại trên đối tượng hay không và đó có phải là phiên bản AngularJS hay không. Nếu không, nó sử dụng chức năng đã được chỉ định (phiên bản gốc):
} else if (obj.forEach && obj.forEach !== forEach) {
obj.forEach(iterator, context);
}
2. Thuận tiện
Trong JavaScript nguyên gốc Array.prototype.forEach
là một phương thức dành riêng cho một thể hiện của Array
, tuy nhiên hầu hết mọi thứ Object
đều có thể lặp lại được.
Vì lý do này, nhiều người tạo thư viện làm cho chức năng của họ đa hình (có thể chấp nhận nhiều loại làm đầu vào). Hãy lấy mã AngularJS ở trên và xem những gì đầu vào chấp nhận:
Chức năng :
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);
}
}
Mảng (với sự hỗ trợ forEach bản địa):
} else if (obj.forEach && obj.forEach !== forEach) {
obj.forEach(iterator, context);
Các đối tượng giống như mảng bao gồm Mảng (không có hỗ trợ forEach gốc), Chuỗi, HTMLE bổ sung, Đối tượng có thuộc tính độ dài hợp lệ:
} else if (isArrayLike(obj)) {
for (key = 0; key < obj.length; key++)
iterator.call(context, obj[key], key);
Các đối tượng:
} else {
for (key in obj) {
if (obj.hasOwnProperty(key)) {
iterator.call(context, obj[key], key);
}
}
}
Phần kết luận
Như bạn có thể thấy AngularJS sẽ lặp lại trên hầu hết mọi Đối tượng JavaScript, mặc dù nó hoạt động giống như chức năng gốc, nó chấp nhận nhiều loại đầu vào khác nhau và do đó là một bổ sung hợp lệ cho thư viện cũng như cách mang các hàm ES5 để các trình duyệt cũ.