2012-10-15 98 views
2

我有一個按鈕,在後面的代碼中我添加了一個onclick,並且我傳遞了一個將傳遞給js函數的唯一ID。該ID以0以0開頭的Javascript提醒號碼

它不工作開始,最終我想通了,數,ID,它是通過錯了...

IE瀏覽器。看到這個:js fiddle

它與數字的開頭和結尾的'一起工作。只是想知道爲什麼013變成11.我做了一些谷歌搜索,但沒有找到任何東西...

乾杯

羅賓

編輯:

謝謝你們。是的,現在明白了。

正如在這種情況下,0在開始時有一個含義,這裏是郵件列表中的收件人ID,我將使用'013'而不僅僅是013,即一個字符串。然後,我可以在js中拆分這些值,因爲這三個值中的每一個代表了一個不同的id,它總是隻有1個字符長,即0-9。

回答

8

與一個0被視爲一個八進制數開始數字文字等於11。因此,基數8中的13是基數10中的11 ...

八進制數字文字已被棄用,但如果您不處於嚴格模式,仍然有效。

(您沒有問,但是)以0x開頭的數字文字被視爲十六進制。

更多信息在MDN

在您的演示中,該參數被稱爲id,這意味着您不需要對其執行數字操作 - 如果是這樣,請將其放在引號中並將其用作字符串。

如果您需要能夠傳遞前導零但仍然將數字視爲基數10來對其執行數字操作,則可以將其用引號括起來以將其作爲字符串傳遞,然後將字符串轉換爲數字在某種程度上部隊基地10,如:

something('013'); 

function something(id){  
    alert(+id);    // use unary plus operator to convert 
    // OR 
    alert(parseInt(id,10)); // use parseInt() to convert   
} 

演示:http://jsfiddle.net/XYa6U/5/

+0

Javascript不會將'08'視爲一般的八進制,只有'parseInt'。其他將字符串轉換爲數字的方法也很好,例如, 'Number('08')','+('08')','1 *'08''全部返回'8',而'parseInt('08')'返回'0'。將前導零表示爲八進制是可選的,但大多數瀏覽器似乎仍在繼續實現它。 – RobG

+0

@RobG看到我的小提琴:[https://jsfiddle.net/Lc9ktzn1/](https://jsfiddle.net/Lc9ktzn1/)parseInt將數字解析爲基數10,無論如何。同樣在那個小提琴上 - 如果一個數字有8個,即使它以0開始,它也不能被解釋爲基數8,所以javascript將其作爲基數10。 – Jan

+0

@ Jan - 這是2012年的規格從那以後發生了變化。雖然ES5在2011年6月成爲標準,但大多數瀏覽器都不符合標準,並且在一段時間內繼續遵循ECMA-262的八進制數字行爲。但是,現在ECMA-262第6版是規範,看起來現代瀏覽器至少符合規範。但是仍然有一個很好的數字,其中前導'0'表示parseInt的八進制數。 ;-) – RobG

2

013是八進制,十進制不,它在十進制

+0

所以我需要始終傳遞一個以1-9開頭的數字纔有效?即得到我想要的號碼? –

+1

或者你可以使用'parseInt(num,10)' – jahroy

+0

是的,就像@jahroy說的那樣,parseInt('013',10)將會返回13 –

0

你應該注意到,013開始用0。在Javascript中,這會導致數字被認爲是八進制數。一般來說,你會想要使用十進制和十六進制數字系統。偶爾,八進制數是有用的,因爲this question shows.

我希望這有助於! :)

0

如果數字的第一個數字是零,parseInt會將該數字解釋爲八進制數。

您可以指定十個這樣的基地:

parseInt(numberString, 10)

你也可以刪除這些零用這樣的正則表達式(其結果將是一個字符串):

numberString.replace(/^0+/g, '');

+0

JavaScript不會將前導零解釋爲八進制,只有'parseInt'。 – RobG