我一直在Javascript中使用parseInt()
函數,但沒有傳遞radix參數。根據MDN文檔here,聲明不提供此參數可能會導致不可預知的行爲。爲什麼建議爲parseInt()提供可選的radix參數?
請始終指定此參數以消除讀者的困惑,並確保可預測的行爲。
有人能澄清這是什麼不可預知的行爲有一些代碼示例是什麼意思?
我一直在Javascript中使用parseInt()
函數,但沒有傳遞radix參數。根據MDN文檔here,聲明不提供此參數可能會導致不可預知的行爲。爲什麼建議爲parseInt()提供可選的radix參數?
請始終指定此參數以消除讀者的困惑,並確保可預測的行爲。
有人能澄清這是什麼不可預知的行爲有一些代碼示例是什麼意思?
在舊版本的語言中,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需要八進制文字「嚴格」模式的領先0o
或0O
,但這並不適用於parseInt()
這(在ES2015)僅覆蓋爲十六進制字符串的默認基數。
出於某種自己最爲人所知的原因,指定此函數行爲的人將基數設置爲可默認參數,但隨後決定將缺省值保留爲實現! (也許堅持10的價值是明智的,但也許這會打亂70年代的民間編程,他們仍然認爲八進制文字是有用的。)
因此,爲了強大的編程,你需要提供基數參數你自己。
如果不提供基數,parseInt
會嘗試根據您傳入的值確定正確的基數,例如,如果該值開始0x
那麼它將確定您必須傳入十六進制值。同樣適用於0
(八進制)。
當您的輸入爲零填充但未提供基數時,這會變得有問題。其中結果將(可能)不按預期
console.log(parseInt(015))
*「時,沒有指定基數,通常默認值以10不同實現產生不同的結果。」 * – Li357