【问题标题】:Why '0' and 'undefined' are not being considered as false in this Javascript code?为什么 '0' 和 'undefined' 在这个 Javascript 代码中不被认为是错误的?
【发布时间】:2020-07-15 15:50:29
【问题描述】:

我只是 JavaScript 的初学者。 我一直在 Javascipt 中的数组上遇到这个问题,我们必须从数组中删除所有错误值。我已经附上了相同的图片JavaScript Array Question

https://codepen.io/tsiruot/pen/NWxLmGV?editors=0012

console.clear();
var arr = [NaN, 0, 15, false, -22, '', undefined, 47, null, 94]
var i
for (i = 0; i < arr.length; i++) {
  if (!arr[i]) {
    arr.splice(i, 1)
  }
}
console.log(arr)

正如您在此代码笔中看到的, 问题是 if(!arr[i]) 没有考虑 0 和 undefined 为真。我正在使用拼接来删除元素。 我哪里错了?``

【问题讨论】:

  • 当你拼接出一个元素时,你改变了数组的长度。因此,下一个i++ 将跳过一个条目。你最好使用.filter()
  • 嗨,过滤器很简单 - es6 功能
  • var arr = arr.filter(i => i);
  • @LakshmanKambam 或arr = arr.filter(Boolean);
  • @LakshmanKambam 它实际上是一个 es5 功能(ECMA-262,第 5 版)。

标签: javascript arrays for-loop if-statement


【解决方案1】:

您的问题是您正在改变数组,导致您跳过检查元素。当您找到NaN 时,您将splice 排除在外,但这会将0 向下移动到索引0,因此当for 循环增加到索引1 时,您甚至都不会检查0'' 后跟 undefined 也是如此。要么反向操作(所以splice 不会影响下一个要检查的值),或者构建一个新数组而不是就地变异(例如使用filter)。

【讨论】:

    【解决方案2】:

    您正在删除数组的索引。当您这样做时,之后的元素会向下移动以填充您刚刚创建的孔。您的代码不考虑您需要检查的下一项现在在您当前所在的索引中。

    第一种方法是如果您删除索引,则减少您的索引以便您检查它。

    var arr = [NaN, 0, 15, false, -22, '', undefined, 47, null, 94]
    var i;
    for (i = 0; i < arr.length; i++) {
      if (!arr[i]) {
        arr.splice(i, 1);
        i--;
      }
    }
    console.log(arr);

    大多数人不会那样做,他们会做的就是从头开始循环。这样,您就不会遇到删除项目的问题。

    var arr = [NaN, 0, 15, false, -22, '', undefined, 47, null, 94]
    var i;
    for (i = arr.length - 1; i >= 0; i--) {
      if (!arr[i]) {
        arr.splice(i, 1);
      }
    
    }
    console.log(arr);

    现代方法是使用过滤器。

    var arr = [NaN, 0, 15, false, -22, '', undefined, 47, null, 94]
    
    arr = arr.filter(function(data) {
      return data;
    });
    
    console.log(arr);

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-10
      • 2013-12-06
      • 1970-01-01
      • 1970-01-01
      • 2013-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多