数组过滤器方法传递的是数据类型而不是谓词

时间:2018-03-10 04:45:40

标签: javascript

我有一个看起来像的数组:

var containers = [2,0,false,"", '12', true];

使用filter方法时,如下所示:

var containers = containers.filter(Boolean);
console.log(containers);

打印:[ 2, '12', true ] 即使将NumberStringObject传递给filter函数,也是如此。根据我的理解filter函数接受一个作为谓词的函数。但是在这里它接受原始数据类型。有人可以解释一下这种行为吗?

4 个答案:

答案 0 :(得分:2)

你传递了实际的布尔函数,所以你实际上将所有值转换为布尔值,而0""都是假的,你得到的结果是......

看看这个过滤器在循环中的工作原理:

Boolean(2); //true
Boolean(0); //false
Boolean(false); //false
Boolean(""); //false
Boolean(12); //true
Boolean(true); //true

我认为你所寻找的是这样的事情:

var containers = [2,0, false ,"", '12', true];
var containers = containers.filter(function(v) { return "boolean" === typeof v});
console.log(containers); //[false, true]

这些是JavaScript中的虚假值列表供您参考:

  1. undefined :如果未定义该值并且该值为undefined
  2. null :如果它为null,例如,如果DOM元素不存在...
  3. 空字符串''
  4. 0 :数字
  5. NaN :不是数字

答案 1 :(得分:0)

布尔实际上是一个函数,除了是一个类型。事实上,所有类型在技术上也是功能。如果传递的值为truthy,则Boolean函数将返回true。 2, "12", and true都是" truthy"价值观,所以他们不会被过滤掉。

答案 2 :(得分:0)

Boolean是一个构造函数,它接受值并返回真值。查看MDN文档:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Boolean

答案 3 :(得分:0)

原始数据类型有一个构造函数,当您将此构造函数传递给过滤器时,它会将基元功能应用于每个数组的值。然后它返回结果,过滤器将通过应用其谓词检查其真实值。

例如,给定containers.filter(String);

String将获得第一个值,比如2,并应用其构造函数并返回“2”。 然后Filter将返回布尔值“2”,其值为true, 确认原件2应该退回。

但是对于数组中的第四个值是“” 是不同的。 字符串将评估为相同的“”,布尔值(“”)将返回false, 这意味着“”不会因过滤而包含在内。

这适用于您应用于过滤器的任何基元。

对于前。 containers.filter(Number);

在数组中第二个元素为0的情况下, 数字(0) - > 0 - > Bollean(0) - > false - >因过滤器而未包含