如果过滤掉所有元素,过滤器会返回什么?

时间:2015-12-13 16:11:04

标签: javascript functional-programming

var falsy = [false , null , 0, "", NaN , undefined  ];

return arr.filter(function(element){ return falsy.indexOf(element) ===  -1   ;});

为什么这会回归NaN。它不应该返回一个空数组???

1 个答案:

答案 0 :(得分:4)

如果没有条目符合条件,

filter确实会返回一个空数组。但NaN永远不会与自身相等,因此indexOf无法找到它(因为它比较===相等),因此indexOf将为{返回-1 {1}}即使NaN位于NaN。因此,如果您有falsyarr条目,则该代码不会过滤掉它们。

NaN是一个非常特殊的值:

NaN

这是ES2015 console.log(NaN == NaN); // false console.log(NaN != NaN); // true console.log(NaN === NaN); // false console.log(NaN !== NaN); // true Map个对象不使用Set===比较的原因的一部分,而是SameValueZero摘要操作,以及建议使用==建议的~ES2016特征Array#includes的原因。 (该规范还定义了SameValue,它使用NaN执行ame操作但以不同方式处理SameValueZero+0。)

一旦-0使用该语言,您就可以使用:

Array#includes

或当然

return arr.filter(function(element) { return falsy.includes(element); });

... return arr.filter(element => falsy.includes(element)); 将与其他假名值一起过滤掉。