4 回答

TA貢獻1828條經驗 獲得超6個贊
在javascript中將字符串轉換為數字有兩種主要方法。一種方法是解析它,另一種方法是將其類型更改為數字。其他答案中的所有技巧(例如一元加)都涉及隱含地將字符串的類型強制轉換為數字。您也可以使用Number函數顯式執行相同的操作。
解析
var parsed = parseInt("97", 10);
parseInt和parseFloat是用于將字符串解析為數字的兩個函數。解析會在遇到無法識別的字符時靜默停止,這對于解析像“92px”這樣的字符串很有用,但它也有點危險,因為它不會在輸入錯誤時給你任何錯誤,而是你除非字符串以數字開頭,否則將返回NaN。字符串開頭的空格將被忽略。這是一個例子,它做了一些不同于你想要的東西,并沒有表明出現任何問題:
var widgetsSold = parseInt("97,800", 10); // widgetsSold is now 97
總是將基數指定為第二個參數是一種好習慣。在較舊的瀏覽器中,如果字符串以0開頭,如果未指定基數,則會將其解釋為八進制,這會讓很多人感到意外。如果沒有指定基數,則通過使字符串以0x開頭來觸發十六進制的行為,例如0xff
。標準實際上使用ecmascript 5進行了更改,因此如果沒有指定基數,則當前導0時,現代瀏覽器不再觸發八進制。parseInt將基數理解為基數36,在這種情況下,大寫和小寫字母都被視為等價。
將字符串的類型更改為數字
上面提到的所有其他不使用parseInt的技巧都涉及隱式地將字符串強制轉換為數字。我更愿意明確地這樣做,
var cast = Number("97");
這與解析方法有不同的行為(盡管它仍然忽略空格)。它更嚴格:如果它不理解整個字符串而不是它返回NaN
,那么你不能將它用于像字符串這樣的字符串97px
。由于您需要原始數字而不是數字包裝器對象,因此請確保不要放在new
數字函數前面。
顯然,轉換為Number會給出一個可能是float而不是整數的值,所以如果你想要一個整數,你需要修改它。有幾種方法可以做到這一點:
var rounded = Math.floor(Number("97.654")); // other options are Math.ceil, Math.roundvar fixed = Number("97.654").toFixed(0); // rounded rather than truncatedvar bitwised = Number("97.654")|0; // do not use for large numbers
任何按位運算符(這里我做了一個按位或,但你也可以做一個雙重否定,如在前面的回答或一個位移)將把值轉換為32位整數,其中大多數將轉換為有符號整數。請注意,這不希望您想要大整數。如果整數不能用32位表示,它將換行。
~~"3000000000.654" === -1294967296// This is the same asNumber("3000000000.654")|0"3000000000.654" >>> 0 === 3000000000 // unsigned right shift gives you an extra bit"300000000000.654" >>> 0 === 3647256576 // but still fails with larger numbers
要使用更大的數字,您應該使用舍入方法
Math.floor("3000000000.654") === 3000000000// This is the same asMath.floor(Number("3000000000.654"))
請記住,所有的這些方法的理解指數形式,所以2e2
是200
不是NaN的。此外,Number理解“Infinity”,而解析方法則不理解。
習慣
這些方法中的任何一種都不可能完全符合您的要求。例如,通常我希望在解析失敗時拋出錯誤,并且我不需要支持Infinity,指數或前導空格。根據您的用例,有時編寫自定義轉換函數是有意義的。
始終檢查Number或其中一個解析方法的輸出是否是您期望的數字。您幾乎肯定會想要isNaN
確保該數字不是NaN(通常是您發現解析失敗的唯一方法)。
添加回答
舉報