怎么' Number'在Array.prototype.filter(Number)中工作?

时间:2014-04-04 22:32:33

标签: javascript arrays

我发现使用Array.prototype.filter方法从字符串中删除所有非数字的这种很酷的方式,但我不完全确定它是如何使用Number原型来实现的:

var arr = '75number9';

arr.split(/[^\d]/).filter(Number); // returns [75, 9]

当我检查typeof Number时,我会回来'function'。这是怎么回事?

进一步令我困惑的是,如果我将Number替换为String,结果是相同的。它仍然有效!

arr.split(/[^\d]/).filter(String); // returns [75, 9]
另一方面,

ArrayObject作为参数返回:

["75", "", "", "", "", "", "9"]

非常好奇理解这一点!

2 个答案:

答案 0 :(得分:9)

Number是一个(构造函数)函数,试图返回一个数字。给它一个文字数字或一个字符串,可以解析为数字,然后返回该数字。给它别的东西,它返回NaN

Filter返回回调函数(在本例中为Number)返回truthy值的值。 != 0!= NaN的数字是真实的,因此会返回。

因此,您的示例不会返回0值:

var arr = '75number0';
arr.split(/[^\d]/).filter(Number);
// ["75"]

请注意,返回的数组的值仍然是字符串。如果我们希望它们是数字,我们可以使用map()

arr.split(/[^\d]/).filter(Number).map(Number);
// [75, 9]

在使用String构造函数而不是Number的情况下,它可以正常工作,因为String为它给出的空字符串返回空字符串,并且空字符串({{1 }})就像''一样是假的。

答案 1 :(得分:1)

> var arr = '75number9';
> arr = arr.split(/[^\d]/)
> arr
["75", "", "", "", "", "", "9"]

Number是装箱Number类型的构造函数。出于某种原因,它也可用作函数:

> Number("")
0
> Number("75")
75

filter保留调用导致非假值的元素。当传递空字符串时,它返回0,这是假的,因此空字符串被丢弃

String,当给出一个字符串参数时,除了返回它之外什么都不做。由于""是假的,filter会再次拒绝空字符串。