我发现使用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]
另一方面, Array
和Object
作为参数返回:
["75", "", "", "", "", "", "9"]
非常好奇理解这一点!
答案 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
会再次拒绝空字符串。