2014-04-04 50 views
10

我發現使用Array.prototype.filter方法刪除字符串中的所有非數字的這種冷靜的方式,但我不能完全肯定它是如何使用Number原型來實現這一點:Array.prototype.filter(Number)中的'Number'如何工作?

var arr = '75number9'; 

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

當我檢查typeof Number我得到返回'function'。這裏發生了什麼?

再加上我的困惑是,如果我用String替換Number,結果是一樣的。它仍然有效!

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

ArrayObject作爲參數,而另一方面,返回此:

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

很好奇,想明白這一點!

+0

某些類型可以是函數。 ['函數對象(用ECMA-262術語實現[[Call]] \t「function」'](https://developer.mozilla。org/en-US/docs/Web/JavaScript/Reference/Operators/typeof) – 13ruce1337

+0

@ 13ruce1337:所有的「types」都是函數,因爲在javascript中一個類和一個構造函數是一個也是一樣的 – Eric

+0

@Eric我只是打破了我的大腦在幾秒鐘前認爲...感謝您的確認。 – 13ruce1337

回答

9

Number是試圖返回數字的(構造函數)的功能。給它一個字面數字或一個字符串,它可以被解析爲數字,並且它返回該數字。給它別的東西,它會返回NaN

過濾器返回的量,回調函數(在這種情況下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將返回空字符串爲給它的空字符串,而空字符串('')與0一樣是僞造的。

+0

+1提及這個問題,這打破了對「0」的期望。 –

+0

好抓!問題然後繼續要求所得數字的總和,所以在這種情況下,0將是不必要的,但點好:) –

+0

+1。今天我學到了一些新東西。 – Andy

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

Number爲盒裝Number類型構造函數。出於某種原因,它也可用作一個函數:

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

filter保持元件,其中調用結果在非falsey值。當空字符串通過時,它返回0,這是falsey,所以空字符串被丟棄

String當給定一個字符串參數時,什麼都不做,只是返回它。由於""有錯,因此filter會再次拒絕空字符串。

+1

構造函數_are_函數。請參閱規格以瞭解數字功能。 – SLaks

+0

@SLaks:的確,但是構造函數返回值不常見 – Eric

+1

「出於某種原因,它也可用作函數」原因在於規範。參見[15.7.1被稱爲函數的數字構造函數](http://es5.github.io/#x15.7.1),更具體地說[15.7.1.1數字(\ [value \])](http:// es5.github.io/#x15.7.1.1)。 –