首頁 > 軟體

解析JS引數parseInt('012', 16)和parseInt(012, 16)是否相等

2023-02-14 06:02:30

引言

parseInt('012', 16)和parseInt(012, 16)相等嗎?

["10", "10", "10", "10", "10"].map(parseInt)的結果是什麼?

先來一起復習一下parseInt()的基本用法。

一、parseInt()的使用說明

使用引數說明:paraseInt(value: string, radix?: number)

parseInt()是對Number()很好的補充

1.1 解析數位和字母的混合字串

Number()返回的都是NaN的時候,parseInt()有不一樣的解析結果。parseInt會忽略無效字元,如果第一個字串元素就非數位,那麼就返回NaN

Number('123abc') // NaN
Number('123asd1') // NaN
Number('ad123') // NaN
// -------
parseInt('123abc') // 123
parseInt('123asd1') // 123
parseInt('123---8979$$$') // 123
parseInt('ad123') // NaN

1.2 用於浮點數的取整:

console.log(parseInt(11.22)) // 11
console.log(Number(11.22)) // 11.22

1.3 將其他的進位制轉化為十進位制

  • 標準格式: parseInt(string, radix)
  • radix: 表示字串的基數,取值範圍是從 2 到 36。16 就表示被解析值是十六進位制數。
  • 計算方法:基數 * (radix ^ (當前位數 - 1)) 然後依次相加

如下例子:

console.log(parseInt(101, 2)) // 5
console.log(parseInt(123, 5)) // 38
parseInt('6axxx', 16) // 106 

parseInt('6axxx', 16), 16進位制能夠識別6a,到x為止。

其轉化的過程如下:

需要注意的是:

  • radix的預設值不一定是10,如果字串 string 以其它任何值開頭,則基數才是10 (十進位制)。

這玩意兒很智慧.輸入的如果是標準的16進位制或者8進位制的話,就可以把radix初始化為對應的進位制的值。比如說parseInt(0xfff) 的結果是4096,不用放入radix值。

但是如果,你後面非要加非16進位制的制位的話,那還是會按照對應的radix來計算。比如parseInt(012, 3)是3而不是8。

1.4 parseInt中的隱式轉化

parseInt('012', 16)和parseInt(012, 16)的結果是否一致呢?

我們列印結構如下:

前者是18,後者是16!, why?

很簡單,其實通過我這個小標題也能夠知道原因。因為parseInt(012, 16)發生了隱式轉化。第一引數是string型別,而它是number型別,構成了隱式轉化的條件,觸發了toString()的規則。

012.toString()結果為10.

所以說

parseInt(012, 16) = parseInt('10', 16).

1×(161)+0×(160)=161 times(16^1)+0times(16^0)=161×(161)+0×(160)=16

二、經典面試題

下面的輸出結果是什麼?

["10", "10", "10", "10", "10"].map(parseInt);

我們需要有這麼一個認知:

  • map是一個函數
  • map的的引數有兩個,一個函數callbackFn,一個可選物件thisArg,用於執行前者用作this值。
  • map的的引數函數有三個引數:currentValueindexarray
  • parseInt就是一個函數

所以說,什麼的題目等於下面程式碼片段:

["10", "10", "10", "10", "10"].map((item, index) => {
  return parseInt(item, index)
})

由此可得:

parseInt('10', 0) // 10
parseInt('10', 1) // NaN
parseInt('10', 2) // 2
parseInt('10', 3) // 3
parseInt('10', 4) // 4

那麼我們根據上面的描述,一起來討論[1, 2, 3, 4].map(parseInt)的結果是什。

以上就是解析parseInt('012', 16)和parseInt(012, 16)是否相等的詳細內容,更多關於parseInt('012', 16) parseInt(012, 16)的資料請關注it145.com其它相關文章!


IT145.com E-mail:sddin#qq.com