谁能解释为什么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
中过滤?
谢谢。
.filter()
API 将每个数组元素值传递给您提供的函数。该函数返回的值被强制转换为布尔值并进行测试。从 .filter()
返回的数组中仅包含true
结果。
Number 构造函数将其参数解释为数字,并返回其值。当它被.filter()
机制传递给字符串"a"时,它返回NaN
,解释为false
。
String 构造函数执行类似的操作,但关键区别在于,几乎任何东西都可以成为良好的有效字符串。 因此,数组中1
的数字以"1"
形式返回,当转换为布尔值时,true
因为它是一个非空字符串。
和字符串构造函数不会对数字或字符串值执行任何类型的是/否标识,因此不能使用它们按类型筛选数组中的值。
Pointy的回答解释了为什么你会看到这种行为。
要实现您似乎想要做的事情,您应该使用:
var arr = [1, "a", '7'],
numArr = arr.filter(function(o) { return typeof(o) === "number"; }),
strArr = arr.filter(function(o) { return typeof(o) === "string"; });