过滤器(字符串)也返回数字

filter(String) also return number

本文关键字:返回 数字 字符串 过滤器      更新时间:2023-09-26

谁能解释为什么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"; });