2012-08-16 80 views

回答

16

兩者都會導致調用內部ToNumber(string)函數。

ES5 section 15.7.1(數量構造作爲函數調用):

Number被稱爲函數,而不是作爲一個構造函數,它執行一個類型轉換...

返回Number值(不是Number對象),如果提供了值,則由ToNumber(value)計算,否則返回+0

ES5 section 15.1.2.3(parseFloat(串)):

... 如果沒有trimmedString也沒有trimmedString滿足任何前綴的語法StrDecimalLiteral(參見9.3.1) ...

而且9.3.1是名爲「ToNumber應用到字符串類型」一節,這是第一次報價是指當它說ToNumber(value)


更新(見註釋)

通過調用Number構造與new運營商,您將得到Number對象的實例,而不是一個數值文字。例如:

typeof new Number(10); //object 
typeof Number(10); //number 

這在section 15.7.2定義(數構造):

Number被稱爲一個new表達式的一部分它是一個構造:它初始化新創建的對象。

+0

那麼,如果我做'新號碼(...)'會發生什麼?這有什麼不同? – Neal 2012-08-16 13:50:29

+0

'typeof new Number(3)===「object」',而'typeof 3 ===「number」'和'typeof Number(3)===「number」' – jackwanders 2012-08-16 13:53:03

+0

您會得到一個Number對象在非嚴格比較中,將調用'valueOf'方法,但與非對象的嚴格比較將失敗。這是一個糟糕的主意,因爲混亂的數字對象國際海事組織(以及它的價值,克羅克福德也不喜歡他們) – 2012-08-16 13:54:55

0

當不使用new創建一個包裝對象爲數值,Number被轉移到簡單地做從字符串到數字的類型轉換。

「parseFloat」,另一方面,正如你提到的,可以以數字,小數,或+/-

所以開始的字符串解析浮點數,如果你只工作只包含數字值的字符串,Number(x)parseFloat(x)將產生相同的值

2

只要您確定字符串中只有數字,就沒有太大的區別。如果有,Number將返回NaN
,你可能會使用Number構造的另一個問題是,同事會認爲你忘了new關鍵字,並將其添加後,引起嚴格的比較失敗new Number(123) === 123 - >假,而Number(123) === 123 - >真。

在一般情況下,我寧願讓Number構造,它是什麼,只是用最短的語法有是爲int /浮動:+numString,或使用parse*

18

內部工作方式沒有那麼不同,就像@詹姆斯阿拉迪克已經回答的那樣。雖然有區別。使用parseFloat,以一個或多個數字字符和字母數字字符開頭的(已修剪)字符串可以轉換爲數字,其中Number不會成功。如:

parseFloat('3.23abc'); //=> 3.23 
Number('3.23abc'); //=> NaN 

在這兩個轉換,輸入字符串被修整,順便說一句:

parseFloat(' 3.23abc '); //=> 3.23 
Number(' 3.23 '); //=> 3.23 
+0

+1,這是真的,但在問題中定義的情況下,沒有區別 - 「當你傳遞一個實際的數字串」。假設我已經正確地理解了這一點。 – 2012-08-16 14:00:59

+0

另一個區別是''''和'「」'的結果,在這兩種情況下,Number都會給出'0',但是parseFloat會給出'NaN'。 – 2012-08-16 14:02:41

+0

我知道這件事。我甚至說在OP ...這是**不**我在問什麼...... – Neal 2012-08-16 14:03:01

-1

請原諒我發佈另一個答案,但我剛到這裏通過谷歌搜索,做沒有找到我想要的所有細節。在Node.js的運行下面的代碼:

var vals = ["1", "1.1", "0", "1.1abc", "", " ", null]; 
for(var i = 0; i < vals.length; i++){ 
    var ifTest = false; 
    if(vals[i]) 
    { 
    ifTest = true; 
    } 
    console.log("val=" + vals[i] + ", Number()=" + Number(vals[i])+ ", parseFloat()=" + parseFloat(vals[i]) + ", if()=" + ifTest); 
} 

給出了下面的輸出:

val=1, Number()=1, parseFloat()=1, if()=true 
val=1.1, Number()=1.1, parseFloat()=1.1, if()=true 
val=0, Number()=0, parseFloat()=0, if()=true 
val=1.1abc, Number()=NaN, parseFloat()=1.1, if()=true 
val=, Number()=0, parseFloat()=NaN, if()=false 
val= , Number()=0, parseFloat()=NaN, if()=true 
val=null, Number()=0, parseFloat()=NaN, if()=false 

一些值得注意的外賣:

  1. 如果想轉換之前,如果(VAL)保護數字,然後parseFloat()將返回一個數字,除了在空白的情況下。
  2. 數字在所有情況下都會返回一個數字,除了空格之外的非數字字符。

請隨時添加我可能會丟失的任何測試用例。