我有一个看起来像的数组:
var containers = [2,0,false,"", '12', true];
使用filter
方法时,如下所示:
var containers = containers.filter(Boolean);
console.log(containers);
打印:[ 2, '12', true ]
即使将Number
,String
或Object
传递给filter
函数,也是如此。根据我的理解filter
函数接受一个作为谓词的函数。但是在这里它接受原始数据类型。有人可以解释一下这种行为吗?
答案 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中的虚假值列表供您参考:
undefined
''
答案 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 - >因过滤器而未包含