javascript .filter()真正的布尔值

jyo*_*006 14 javascript boolean filter

function bouncer(arr) {
  // Don't show a false ID to this bouncer.
    function a(b) {
      if(b !== false) {
        return b;
      }
    }

    arr = arr.filter(a);
    return arr;
}

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

我只需返回真正的布尔语句,当我运行此代码时,它可以工作.但是,我很困惑,因为我的"if语句"将起作用,无论是b!== true还是b!== false.有人可以解释一下这两种方式的原因吗?

小智 50

显然.filter()是在 ES5 中引入的。

这绝对帮助我了解这里发生的事情。希望能帮助到你!

本质上,写作:

arr.filter(Boolean)
Run Code Online (Sandbox Code Playgroud)

和写一样:

arr.filter( function(x) { return Boolean(x); }); 
Run Code Online (Sandbox Code Playgroud)

因为Boolean()也是一个函数,它在真时返回真,假时返回假!

例子:

arr.filter(Boolean)
Run Code Online (Sandbox Code Playgroud)

来源:这里


hel*_*rld 37

我正在解决类似的问题,并想出了这个:

function bouncer(arr) {
  return arr.filter(Boolean);
}
bouncer([7, 'ate', '', false, 9]);
// returns ['7','ate','9']
Run Code Online (Sandbox Code Playgroud)


Emi*_*lev 6

这是因为您返回了值。过滤器函数应该像这样返回真或假:

function bouncer(arr) {
    arr = arr.filter(function(x) { console.log(x === true)
       if(x !== false) {
           return true;
       }
    });
    return arr;
}
Run Code Online (Sandbox Code Playgroud)

或更短:

function bouncer(arr) {
    return arr.filter(function(x) { console.log(x === true)
       return x !== false;
    });
}
Run Code Online (Sandbox Code Playgroud)


小智 6

最简单的方法:

function bouncer(arr) {
    return arr.filter(x => !!x);
}
Run Code Online (Sandbox Code Playgroud)

  • 使用`arr.filter(Boolean)`更简单 (6认同)
  • @user25976 `Boolean(false)` 返回 `false`。`new Boolean(false)` 返回一个对象。关键字“new”产生了差异。 (2认同)

jdp*_*nix 3

你的函数的行为是因为布尔比较中的 JavaScript 值是“真”或“假”。在布尔上下文(比较、if 语句等)中使用时,非布尔值会被强制转换为布尔值。

如果我理解您的意图,您可以修改您的函数以获得预期的输出,如下所示:

function bouncer(arr) {
  // Don't show a false ID to this bouncer.
    function a(b) {
      if(typeof(b) === 'boolean' && !b) {
        return new Boolean(b);
      }
    }

    arr = arr.filter(a);
    return arr;
}

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