从数组中删除Falsy值

mso*_*491 0 javascript arrays boolean filter

所以我正在做FreeCodeCamp挑战"从数组中删除所有的虚假值".

我做了一个函数,但由于某种原因它不会过滤所有的假值:

function bouncer(arr) {

function truthy(value) {
 return value !==  '' ||false || null || undefined || NaN ;
}

 var filtered = arr.filter(truthy);
 return filtered;
}

bouncer([7, "ate", "", false, 9]);
Run Code Online (Sandbox Code Playgroud)

这应该回来了

[7, "ate", 9], 
Run Code Online (Sandbox Code Playgroud)

而是返回

[ 7, 'ate', false, 9 ]
Run Code Online (Sandbox Code Playgroud)

如果我切换函数truthy的顺序,返回的值会改变.例如移动'',

function truthy(value) {
   return value !==  '' ||false || null || undefined || NaN ;
Run Code Online (Sandbox Code Playgroud)

----->

  return false || null || undefined || NaN || " ; 
Run Code Online (Sandbox Code Playgroud)

新的

假|| null || undefined || NaN || ";回归

[ 7, 'ate', '', 9 ]
Run Code Online (Sandbox Code Playgroud)

知道发生了什么事吗??? 谢谢!

Aux*_*aco 5

return value !== '' ||false || null || undefined || NaN ;

这不符合你的想法.它实际上相当于

(((((value !== '') || false) || null) || undefined) || NaN)
Run Code Online (Sandbox Code Playgroud)

value !== '',因为在大多数的你的情况下,这种表达是真实的.你真的需要检查

value !==  '' && value !== false && value !== null && value !== undefined && value !== NaN
Run Code Online (Sandbox Code Playgroud)

但是,既然这些都是假的,Array.filter只关心真实性和虚假性,你可以用你的truthy功能取而代之

function truthy(value) {
  return value;
}
Run Code Online (Sandbox Code Playgroud)

这甚至不值得突破三行:

var filtered = arr.filter(e => e);
Run Code Online (Sandbox Code Playgroud)