Javascript 为什么在filter中使用if语句而不是仅仅返回时会得到不同的输出
我是JavaScript新手,正在学习一些关于高阶函数的知识。我想知道是否有人能告诉我原因: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的“美”。在第一个示例中,在过滤器中返
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))
因此,essuy0
的内容是错误的。因此,当您返回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]