可以在此处删除空值检查吗

Can a check for null be removed here?

本文关键字:空值 检查 删除      更新时间:2023-09-26

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

我采用了下面的代码并对其进行了修改,以消除对null的初始检查。通过用键显式检查某个东西,我们可以提供一个似乎更有力的保证,即某个东西不会溜走(obj==null),并且我们可以消除4个控制语句中的1个。更新在代码段2中。

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

CCD_ 2将检测CCD_ 3和CCD_。

来自Undercore:

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

新的片段。直接在注释后面的行已被修改。

代码段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个

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

此删除操作是否正确?

好吧,你已经改变了控制流程。如果传入数组或其他对象,行为不会发生变化,但新的代码片段不会枚举布尔值和数字(如这里所示),也不会尝试迭代空字符串。不确定你认为什么是"正确的"。