我正在学习javascript并使用以下代码从字符串中过滤出虚假值。
function isFalsy(value) {
if(value === false)
return false;
if(value === null)
return false;
if(value === 0)
return false;
if (value ==="")
return false;
if (value === undefined)
return false;
if(value.isNaN)
return false;
return true;
}
function bouncer(arr) {
arr = arr.filter(isFalsy);
return arr;
}
我运行以下内容:
bouncer([1, null, NaN, 2, undefined]);
我的结果除外:
[1,2]
但它给了我
[1,null, 2]
发生了什么事?
答案 0 :(得分:3)
问题不是null
,而是NaN
;证明:
function isFalsy(value) {
if(value === false)
return false;
if(value === null)
return false;
if(value === 0)
return false;
if (value ==="")
return false;
if (value === undefined)
return false;
if(value.isNaN)
return false;
return true;
}
function bouncer(arr) {
arr = arr.filter(isFalsy);
return arr;
}
console.log(bouncer([1, null, NaN, 2, undefined]));

原因是if(value.isNaN)
检查isNaN
上名为value
的属性是否真实。正确的检查是if (isNaN(value))
,因为isNaN
是用于测试NaN
的内置函数(因为NaN === NaN
是false
,因此您无法检查function isFalsy(value) {
if(value === false)
return false;
if(value === null)
return false;
if(value === 0)
return false;
if (value ==="")
return false;
if (value === undefined)
return false;
if(isNaN(value))
return false;
return true;
}
function bouncer(arr) {
arr = arr.filter(isFalsy);
return arr;
}
console.log(bouncer([1, null, NaN, 2, undefined]));
检查那样):
isFalsy

也就是说,从过滤器回调中返回任何有价值的值都会删除该条目,因此您根本不需要 arr = arr.filter(function(value) { return value; });
(除了用于学习目的):
function bouncer(arr) {
arr = arr.filter(function(value) { return value; });
return arr;
}
console.log(bouncer([1, null, NaN, 2, undefined]));
"LOTS 1, 2 & 3 -50 X 140 EACH-"
"PLOTS 17 & 18 -50 X150' EACH-"

答案 1 :(得分:2)
在很多条件下,你不必使用这整个复杂的功能。
只需使用.filter(v => v)
即可删除每个falsy
值。
v
是Array#filter
函数的参数。我们过滤每个truthy值并将其传递给res
变量。虚假值 - [0, false, "", null, undefined, NaN]
不会被过滤(传递)。
var arr = [1, null, NaN, 2, undefined, '', 0],
res = arr.filter(v => v);
console.log(res);

答案 2 :(得分:0)
您只需使用Array#filter()
console.log(bouncer([1, null, NaN, 2, undefined]));
function bouncer(arr){
return arr.filter(a=>a);
}