可以在这里删除空检查吗?

时间:2013-07-02 15:24:53

标签: javascript

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

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

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

obj == null会检测到undefinednull

来自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;
        }
      }
    }
  };

1 个答案:

答案 0 :(得分:0)

  

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

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

  

此删除工作是否正常?

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