2017-07-07 61 views
3

我一直在Javascript中使用parseInt()函數,但沒有傳遞radix參數。根據MDN文檔here,聲明不提供此參數可能會導致不可預知的行爲。爲什麼建議爲parseInt()提供可選的radix參數?

請始終指定此參數以消除讀者的困惑,並確保可預測的行爲。

有人能澄清這是什麼不可預知的行爲有一些代碼示例是什麼意思?

+0

*「時,沒有指定基數,通常默認值以10不同實現產生不同的結果。」 * – Li357

回答

4

在舊版本的語言中,parseInt()會導致函數遵循正常的JavaScript數值常量語法規則,包括識別前導零以表示八進制常量,以及前導0x表示十六進制常量。因此,如果你的代碼沒有明確堅持基數10,那麼帶有前導零的雜散(可能是用戶提供的)數字將被解釋爲基8值,並且以十六進制開頭0x。

自從ES5.1(我想;可能早些時候)以來,base-8的行爲已經消失,但是基本的16行爲仍然存在。 (可能前導的0x是一個偶然的前綴比一個簡單的前導0更罕見)。

我的經驗在堆棧溢出看這裏的代碼是parseInt()無論如何被過度使用。這是通常清潔轉換爲字符串(通常,從DOM元素.value性質採取字符串),以數字與一元+操作:

var count = +document.getElementById("count").value; 

這不一定給你一個整數,當然。但是,所做的是注意到輸入字符串具有尾隨的非數字垃圾。 parseInt()函數將停止解析像「123abc」這樣的字符串,並將123作爲數字值。領先的+會給你一個NaN

如果你需要整數,你總是可以使用Math.floor()Math.round()

編輯 —評論指出,ES2015需要八進制文字「嚴格」模式的領先0o0O,但這並不適用於parseInt()這(在ES2015)僅覆蓋爲十六進制字符串的默認基數。

+0

@Bathsheba我我從來沒有見過這種說法,但我當然不能說沒有人會說這些話。 – Pointy

+2

@Bathsheba在[ECMAScript 6/ES2015](https://www.ecma-international.org/ecma-262/6.0/)中,八進制文字的格式爲'0o',如二進制:'0b'和十六進制:' 0x'。 – Li357

+0

@AndrewLi在「嚴格」模式下是正確的;否則(爲了不打破互聯網)有「傳統」模式,繼續承認只是領先的'0'。但另一方面,我沒有注意到關於ES2015(可能是因爲我通常不需要八進制文字)。 – Pointy

-1

出於某種自己最爲人所知的原因,指定此函數行爲的人將基數設置爲可默認參數,但隨後決定將缺省值保留爲實現! (也許堅持10的價值是明智的,但也許這會打亂70年代的民間編程,他們仍然認爲八進制文字是有用的。)

因此,爲了強大的編程,你需要提供基數參數你自己。

0

如果不提供基數,parseInt會嘗試根據您傳入的值確定正確的基數,例如,如果該值開始0x那麼它將確定您必須傳入十六進制值。同樣適用於0(八進制)。

當您的輸入爲零填充但未提供基數時,這會變得有問題。其中結果將(可能)不按預期

console.log(parseInt(015))

+0

對於我來說,你明顯處於專業領域的另一端,但是函數*是否必須以這種方式實現? – Bathsheba

+1

@Bathsheba我不知道。如果我正在寫它,我可能會默認它爲'10',因爲它顯然是99%的用戶期望的。畢竟我們是10個基地的生物 – Jamiec

+1

@Bathsheba該語言的當前規範仍然堅持認識到前導的0x或0X表示一個十六進制常量,但只有當基數沒有明確地作爲參數傳遞時。 – Pointy

相關問題