Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/445.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 是否可以在此处删除对null的检查?_Javascript - Fatal编程技术网

Javascript 是否可以在此处删除对null的检查?

Javascript 是否可以在此处删除对null的检查?,javascript,Javascript,这将为可移植对象提供更强的检查,并减少控制结构 我使用了下面的代码并对其进行了修改,以消除对null的初始检查。通过使用键显式地检查某些内容,我们可以提供一个看起来更有力的保证,即某些内容不会滑过(obj==null),并且我们可以消除4条控制语句中的1条。更新在代码段2中 另外,通过添加对&&obj的检查,我们可以避免抛出错误,这似乎是原始检查的目的 obj==null将检测未定义的和null 发件人: Snippet1 var each = _.each = _.forEach = func

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

我使用了下面的代码并对其进行了修改,以消除对null的初始检查。通过使用键显式地检查某些内容,我们可以提供一个看起来更有力的保证,即某些内容不会滑过(obj==null),并且我们可以消除4条控制语句中的1条。更新在代码段2中

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

obj==null
将检测未定义的
null

发件人:

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;
        }
      }
    }
  };
我们可以消除4条控制语句中的1条

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

此拆卸是否正常工作


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

第一个片段有什么问题?使用保护条件是一种很好的做法。您所说的“通过使用键显式检查某物”是什么意思?使用
for in
枚举数字或布尔值是不可能的@pure_code.mom:不可能将属性分配给原语值,没错。但是你仍然可以在枚举中使用它们,在枚举中它们被隐式地强制转换为对象:-请将你的下一票更改为上一票:-)我并不是说这是相关的,当然,我只是想表明有一点不同。我没有做任何更改,只是添加了演示链接。答案的第一部分(关于“使代码更复杂、更慢”)仍然有效。如果你澄清你关于“正确性”的问题(将其改为对数组和对象是否同样有效?或其他什么),我很乐意修改我的答案。我拿出了额外的If…以防有人传递带有原型属性的数字(这是真的吗?),等等。现在,如果你可以编辑。我现在说的是用两个
obj&
替换单个if语句。请注意,
for in
忽略
null
undefined
没有问题。另外,请注意,nativForEach比所有其他循环数组的方法都慢,我现在已经看到了两个jsperf……因此这将是下一步,简单地删除if语句。end函数将更快更简单,因为它简化为if和else语句。
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;
        }
      }
    }
  };
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;
        }
      }
    }
  };