为什么此函数会过滤掉“空”值

Why does this function filter out 'null' values?

本文关键字:过滤 函数 为什么      更新时间:2023-09-26

我正在尝试编写一个快速函数来过滤掉任何虚假值。 这似乎抓住了除"null"之外的所有内容。

请帮忙!

function noFalsy(arr) {
var none=function(val){
         switch (val){
           case false:
           case null:
           case "":
           case 0:
           case undefined:
           case NaN:
             return false;
           default:
             return true;
         }
       },
  ans=[];
ans=arr.filter(none);

return ans;
}

你不能检查这样的NaN

在 JavaScript 中,NaN !== NaNtrue 。这就是为什么你应该使用 Number.isNaN 来检查一个值是否NaN;这也是筛选器不适用于NaN值的原因。switch 语句永远不会到达NaN事例的正文,因为内部相等性检查将始终失败。

如果你只想过滤掉虚假值,你可以依靠它们的虚假性,而不是检查它们的确切值,这要快得多:

[1, null, undefined, NaN, 0, "", true].filter(x => x); // [1, true]

首先,您当前的代码确实过滤掉了null值(但它不会过滤掉NaN)。看看我在说什么。

在您的示例中,请务必注意NaN !== NaN因为现在有办法判断"不是数字"是否与另一个"不是数字"的元素相同。

从数组中省略任何虚假值的一种更简单的方法是遍历数组,并返回任何真实的值:

function noFalsy(arr){
    var output = [];
    arr.filter(function(element){
        // If the element is not falsy, add it to our output array
        if(element){
            output.push(element);
        }
    });
    return output;
}
console.log(noFalsy([1, true, 0, null, false, NaN])); // => [1, true]

工作小提琴