Tôi đã kiểm tra như thế nào UnderscoreJS thực hiện của họ each
/forEach
gạch của mỗi kiểm tra cho {} trở lại của callback
//somewhere up top:
var breaker = {};
//then the each function
var each = _.each = _.forEach = function (obj, iterator, context) {
if (obj == null) return;
if (nativeForEach && obj.forEach === nativeForEach) {
obj.forEach(iterator, context);
} else if (obj.length === +obj.length) {
for (var i = 0, l = obj.length; i < l; i++) {
if (iterator.call(context, obj[i], i, obj) === breaker) return;
}
} else {
for (var key in obj) {
if (_.has(obj, key)) {
if (iterator.call(context, obj[key], key, obj) === breaker) return;
}
}
}
};
//iterator = callback
//context = optional third parameter of each to provide context in the callback
//obj = the list
//key = key of the object (i for index when an array)
Về cơ bản, nó thực hiện các cuộc gọi lại cho từng hạng mục trong đối tượng/mảng. Nhưng như thế này confuses me
if (iterator.call(context, obj[key], key, obj) === breaker) return;
Từ những gì tôi hiểu, nếu gọi lại trả về một đối tượng, phá vỡ vòng lặp, nhưng ... Tại sao nó so với breaker
mà là một đối tượng bên trong module gạch?. Nó không phải là đánh giá để false
tất cả các thời gian kể từ khi, ngay cả khi gọi lại không trả lại một đối tượng, nó luôn luôn là false
vì nó không phải là cùng một đối tượng (do đó vòng lặp không bao giờ vi phạm). Lý do đằng sau điều này là gì?
Một mẹo khác mà tôi thích, nếu bạn cần thêm giá trị cho các đối tượng ngắt là thay vào đó hãy tạo một lớp Breaker và sử dụng các kiểm thử instanceof. – hugomg