在尝试在JavaScript中查找“数字”类型时,为什么会出现错误的结果?

问题描述 投票:2回答:2

还有一个关于typeof的问题。它不包括这些例子。

为什么不使用arrNew在第一个filter()中使用0进行类型操作?

它使用arrNew02在第二个filter()中工作。

如果我在if语句中返回之前放入console.log语句,它会将0识别为typeof“number”。

function filterArray(arr){

var arrNew = arr.filter(function(item){
    if(typeof item === "number"){
      console.log("typeof item: " + item +  " " + typeof item);
      return item;
    }
  });


console.log("arrNew: " +  arrNew);

var arrNew02 = arr.filter(function(item){
    return(typeof item === "number");
});

console.log("arrNew02: " + arrNew02);

}

filterArray([1, "a", "b", 0, 15]);
// This should return [1, 0, 15]

我尝试使用isNaN。但是,它错过了这个例子中的字符串数字。它将返回“1”。

var arrNew03 = arr.filter(function(item){
    if(isNaN(item) === false){
      return item;
    }
});

console.log("arrNew03: " + arrNew03);


filterArray([1, 2, "aasf", "1", "123", 123]);
// This should return [1, 2, 123]

那么,查找项目类型的最佳方法是什么?数字,字符串等有不同的方法吗?我确实阅读了MDN文档。在最后,它有一个链接,为什么typeof不再安全。但是,我不认为这里的相关讨论是相关的。 http://es-discourse.com/t/why-typeof-is-no-longer-safe/15

javascript typeof
2个回答
0
投票

Array#filter需要一个truthy值来包含新数组中的元素。

返回值为零的项目不包括此项目。

描述

filter()为数组中的每个元素调用一次提供的回调函数,并构造一个包含callback返回a value that coerces to true的所有值的新数组。仅对已分配值的数组的索引调用callback;对于已删除的索引或从未分配过值的索引,不会调用它。不通过callback测试的数组元素被简单地跳过,并且不包括在新数组中。


0
投票

数字0是唯一被转换为布尔值false的数字。所有其他数字投向true。如果你为你的过滤结果返回item,并且item解析为false(如果item === 0它将会这样),那么该项目将被过滤掉。

你需要在第一次true通话中返回item而不是arr.filter

© www.soinside.com 2019 - 2024. All rights reserved.