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

时间:2017-12-20 19:33:56

标签: javascript typeof

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

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

它在带有arrNew02的第二个过滤器()中工作。

如果我在if语句中返回之前放入一个console.log语句,它确实将0识别为“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

2 个答案:

答案 0 :(得分:0)

Array#filter需要truthy值才能将元素包含在新数组中。

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

  

<强>描述

     

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

答案 1 :(得分:0)

数字0是唯一可以转换为布尔值false的数字。所有其他数字都投放到true。如果您为过滤结果返回item,并且item已解析为false(如果item === 0将会结算),则该项目将被过滤掉。

您需要在首次true来电中退回item而不是arr.filter