1. 程式人生 > 實用技巧 >把其它的資料型別轉換為number型別的深入理解

把其它的資料型別轉換為number型別的深入理解

顯式轉換方案:

  • Number([val]) -> 隱式轉換一般調取的都是這個方法 「瀏覽器有自己的特殊處理,針對於每一種情況都有詳細的規則」
  • parsetInt/parseFloat([val])
    • parsetInt([val],[radix])處理機制
      • [val] 必須是一個字串,如果不是,則也要預設轉換為字串
      • [radix]不設定(或者寫的是零):正常都是按照 10 處理的,如果字串是以”0x“開始的,預設值是 16...
    • 先在[val]中,找到所有符合[radix]進位制的內容(從左到右查詢,直到遇到不符合的為止「不論後面是否還有符合進位制的,都不在查找了」),然後再把找到的內容看做[radix]
      進位制,轉換為十進位制
    • [radix]範圍 2~36,除了 0 以外(0->10/16),不在這個範圍內,結果都是 NaN

例如:parseInt('12px') -> parseInt('12px',10)
->在字串中找到所有符合10進位制的內容 ‘12’ -> 最後把'12'當做看做10進位制,轉換為10進位制 -> 12
parseInt('12px',1) -> NaN

怎麼換算把其它進位制轉換為10進位制?那就是從右到左,每一位的值乘以進位制的當前值位權冪
例如:'10101' 2機制 -> 10進位制
12^0 + 02^1 + 12^2 + 02^3 + 1*2^4 = 1+2+4+8+16 = 21

long long ago的面試題

let arr = [27.2, 0, '0013', '14px', 123]
arr = arr.map(parseInt)
console.log(arr) // [27,NaN,1,1,27]
/* 解題思路
第1次迴圈傳值parseInt(27.2,0)  先轉字串'27.2',第二位不寫或者是0預設都是按照10進位制進行運算,27
第2次迴圈傳值parseInt(0,1)  沒有1進位制,NaN
第3次迴圈傳值parseInt('0013',2) 2進位制轉10進位制,找到'01'符合2進位制,1*2^0+0*2^1+0*2^2 = 1
第4次迴圈傳值parseInt('14px',3) 3進位制轉10進位制,找到'1'符合3進位制,1*3^0 = 1
第5次迴圈傳值parseInt(123,4) 先轉字串'123',4進位制轉10進位制,找到'123'符合4進位制,3*4^0 + 2*4^1 + 1*4^2 = 27
*/