var falsy = [false , null , 0, "", NaN , undefined ];
return arr.filter(function(element){ return falsy.indexOf(element) === -1 ;});
为什么这会回归NaN。它不应该返回一个空数组???
答案 0 :(得分:4)
filter
确实会返回一个空数组。但NaN
永远不会与自身相等,因此indexOf
无法找到它(因为它比较===
相等),因此indexOf
将为{返回-1 {1}}即使NaN
位于NaN
。因此,如果您有falsy
个arr
条目,则该代码不会过滤掉它们。
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));
将与其他假名值一起过滤掉。