为什么在这个Javascript代码中,'0'和'undefined'不被认为是假的?



我只是JavaScript的初学者。关于Javascipt中的数组,我一直被这个问题所困扰,在这个问题中,我们必须从数组中删除所有的false值。我附上了一张相同JavaScript数组问题的图片

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)

正如你在这个代码笔中看到的,问题是如果(!arr[i](不考虑0并且未定义为true。我正在使用拼接来删除元素。我哪里出问题了?``

您的问题是在执行过程中更改数组,导致跳过检查元素。当您找到NaN时,您会将其splice输出,但这会将0向下移动到索引0,因此当for循环递增到索引1时,甚至不会检查0''也是如此,然后是undefined。要么反向操作(这样splice就不会影响下一个要检查的值(,要么构建一个新的数组,而不是原地突变(例如使用filter(。

您正在删除数组的索引。执行此操作时,之后的图元向下移动以填充刚刚创建的孔。你的代码没有考虑到你需要检查的下一个项目现在在你当前所在的索引中。

第一种方法是如果你删除索引,减少你的索引,这样你就会检查它

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

最新更新