它将为可迭代对象提供更强的检查,并减少控制结构。
我采用了下面的代码并对其进行了修改,以摆脱对 null 的初始检查。通过使用键显式检查某些内容,我们可以提供看似更强大的保证,即某些内容不会溜走(obj == null),并且我们可以消除 4 个控制语句中的 1 个。更新在片段 2 中。
此外,通过添加检查,&& obj
我们可以避免抛出错误,这似乎是原始检查的目的。
obj == null
将检测undefined
和null
。
从下划线:
片段1
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;
}
}
}
};
新的片段。直接在评论之后的行已被修改。
片段 2a
var each = _.each = _.forEach = function(obj, iterator, context) {
// modify - obj &&
if (nativeForEach && obj && obj.forEach === nativeForEach) {
obj.forEach(iterator, context);
// modify - obj &&
} else if (obj && (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;
}
}
}
};
如果 3 种情况中的 0 种匹配,则return undefined
默认情况下,即隐式匹配,则会失败。
此删除工作是否正常?
根据讨论:
片段 2b
var each = _.each = _.forEach = function(obj, iterator, context) {
if (obj && (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;
}
}
}
};