Javascript 为什么在filter中使用if语句而不是仅仅返回时会得到不同的输出

Javascript 为什么在filter中使用if语句而不是仅仅返回时会得到不同的输出,javascript,Javascript,我是JavaScript新手,正在学习一些关于高阶函数的知识。我想知道是否有人能告诉我原因: function filter_list(arr) { return arr.filter(function(item) { return typeof(item) == 'number'; }); } // input = [1,'a','b',0,15] output = [1,0,15] 但是 我很难看出区别。这就是javascript的“美”。在第一个示例中,在过滤器中返

我是JavaScript新手,正在学习一些关于高阶函数的知识。我想知道是否有人能告诉我原因:

function filter_list(arr) {
  return arr.filter(function(item) {
    return typeof(item) == 'number';   
  });
}
// input = [1,'a','b',0,15] output = [1,0,15]
但是


我很难看出区别。

这就是javascript的“美”。在第一个示例中,在过滤器中返回布尔值。项目的类型等于或不等于数字

在第二个示例中,返回项目本身。所以返回1、0和15。由于编程时1为true,0为false,javascript将返回的0视为筛选器失败。所以它被过滤了。换句话说,与0不同的一切都是真的,而0是假的。

在第二种情况下:

function filter_list(l) {
  return l.filter(function(item){
    if (typeof item == "number") {
      return item;
    }
  });
}
项的值用于过滤或不过滤自身。当
值为
0
时,它相当于
false
,因此,它不包括在结果中。传递给
filter
的函数需要一个布尔结果,如果不返回布尔值,则必须了解javascript将如何解释它

自己检查,
0
相当于
false
,因此,如果返回
0
,将对元素进行过滤:


console.log(false==0)
过滤器检查布尔值,它将把0和1作为true和false,因此如果false==0,则返回0无效

console.log(过滤器列表([1,'a','b',0,15]);
函数过滤器列表(l){
返回l.过滤器(功能(项目){
如果(项目类型=“编号”){
退货项目;
}
});

}
这是因为JavaScript具有
falsy
值。Javascript将
null
undefined
0
false
视为
falsy

function filter_list(arr) {
  return arr.filter(function(item) {
    return typeof(item) == 'number';   
  });
}
// input = [1,'a','b',0,15] output = [1,0,15]
在该函数中,比较类型后返回
boolean
,在这种情况下,将选择在比较中返回
true
的每个项目

在该函数中,您返回的是
而不是
比较结果
,因为
0
falsy
值,所以不会为筛选列表选择它

function filter_list(l) {
  return l.filter(function(item){
    if (typeof item == "number") {
      return item;
    }
  });
}
// input = [1,'a','b',0,15] output = [1,15]

筛选器要求您提供一个布尔变量。这是在您的第一个示例中完成的。第二个示例是可能的,因为Javascript没有使用静态类型。被解释为布尔值的项
0
false
。因此,如果您返回0,则筛选器不会附加该项。

您提供的两个示例完全不相同

在第一个示例中,您将返回表达式
typeof(item)=“number”
的求值结果,根据具体情况,该表达式将为
true
false

在第二种情况下,有三种完全不同的可能性

前两个由
if
语句涵盖:如果项目的类型是number,则返回的项目本身可能为“false”(零或NaN),从而导致过滤器失败或“truthy”(除零或NaN以外的任何内容)


但是,如果项目的类型不是number,那么也会隐式返回
undefined
。这对筛选器没有影响,因为
undefined
是错误的,但是如果将此模式复制到其他地方使用,您可能会得到意外的结果,应该避免这种情况。

这是因为
Array.prototype.filter()
创建了一个新数组,其中包含测试函数返回真实值的所有元素(见此处:)

因为
0
是falsy,所以它不是第二个示例中返回的数组的一部分。

Filter 如果条件为
true
,则筛选器返回一个值;如果条件为
false

功能过滤器(arr){
返回arr.filter(函数(x){
返回x
})
}
常量布尔=[假,假,真]
//此日志仅记录“true”

console.log(filter(booleans))
因此,essuy
0
的内容是错误的。因此,当您返回
0
时,它将被视为
返回false
function filter_list(l) {
  return l.filter(function(item){
    if (typeof item == "number") {
      return item;
    }
  });
}
// input = [1,'a','b',0,15] output = [1,15]