2

它将为可迭代对象提供更强的检查,并减少控制结构。

我采用了下面的代码并对其进行了修改,以摆脱对 null 的初始检查。通过使用键显式检查某些内容,我们可以提供看似更强大的保证,即某些内容不会溜走(obj == null),并且我们可以消除 4 个控制语句中的 1 个。更新在片段 2 中。

此外,通过添加检查,&& obj我们可以避免抛出错误,这似乎是原始检查的目的。

obj == null将检测undefinednull

下划线

片段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;
        }
      }
    }
  };
4

1 回答 1

0

我们可以消除 4 个控制语句中的 1 个

…但是您必须在obj &&其他检查中添加这些检查,甚至必须在对象循环周围引入另一个 if 条件。通过这种“改进”,您正在使代码更加复杂和缓慢。

此删除工作是否正常?

嗯,你已经改变了控制流。如果您传入数组或其他对象,则不会改变行为,但您的新代码段不会枚举布尔值和数字(如此),也不会尝试迭代空字符串。不确定您认为什么是“正确的”。

于 2013-07-02T16:19:06.407 回答