任何人都可以解释为什么filter(String)
也会返回号码吗?
var arr = [1, "a", '7'],
numArr = arr.filter(Number), // return 1, 7 (It's Ok)
strArr = arr.filter(String); // Why return 1, a, 7
alert("numArr = " + numArr + "\n" + "strArr = " + strArr);
alert("typeof arr[0] = " + typeof arr[0]);

在上面的示例中,typeof arr[0]
为number
;但是为什么它没有在strArr
过滤?
感谢。
答案 0 :(得分:2)
.filter()
API将每个数组元素值传递给您提供的函数。该函数返回的值被强制转换为boolean并进行测试。 true
返回的数组中仅包含.filter()
个结果。
Number构造函数将其参数解释为数字,并返回其值。当.filter()
机制传递字符串“a”时,它返回NaN
,其被解释为false
。
String构造函数执行类似的操作,但关键的区别在于几乎任何东西都是一个好的有效字符串。因此,数组中的1
返回为"1"
,转换为布尔值时为true
,因为它是非空字符串。
要说明另一种方式,不的情况下,Number和String构造函数执行任何类型的是/否标识数值或字符串值,因此您不能使用它们来过滤数组中的值。
答案 1 :(得分:2)
Pointy的回答解释了为什么你会看到这种行为。
要实现您想要做的事情,您应该使用:
var arr = [1, "a", '7'],
numArr = arr.filter(function(o) { return typeof(o) === "number"; }),
strArr = arr.filter(function(o) { return typeof(o) === "string"; });