这将为可迭代对象提供更强大的检查,并减少控制结构。
我已经采用下面的代码并修改它以摆脱对null的初始检查。通过使用键显式检查某些内容,我们可以提供看似更强的保证,即某些内容不会滑过(obj == null),并且我们可以消除4个控制语句中的1个。更新位于代码段2中。
此外,通过添加&& obj
的检查,我们可以避免抛出错误,这是原始检查的目的。
obj == null
会检测到undefined
和null
。
来自Underscore:
Snippet1
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;
}
}
}
};
新代码段。注释后面的行已被修改。
Snippet 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
,即隐式地。
此删除工作是否正常?
每次讨论:
Snippet 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;
}
}
}
};
答案 0 :(得分:0)
我们可以消除4个控制语句中的1个
...但是你必须在其他人中添加obj &&
个检查,你甚至必须在对象循环周围引入另一个if条件。你正在通过“改进”使代码更复杂,更慢。
此删除工作是否正常?
嗯,你已经改变了控制流程。如果传入数组或其他对象,则没有行为更改,但您的新代码段不会枚举布尔值和数字(如here),也不会尝试迭代空字符串。不确定你认为“正确”。