JS 關於map和parseInt的一道大廠面試題

上次寫過一遍關於這道題的講解,有些繁瑣,如今從新寫一下web

1. 題目是這樣的

let arr = [1,2,3,4];
arr = arr.map(parsetInt);
console.log(arr);
複製代碼

2. 分析

arr = arr.map(parsetInt); 重點就是在這一句話,這裏有兩個知識點,一個是map,一個是parseInt數組

[].map()是數組原型上的一個方法,它是遍歷數組中的每一項,而且支持返回值的。例如:

[1,2,3].map(item=>{
  return item*2;   //[2,4,6]
});
複製代碼

具體的map方法:mdn講解編輯器

從上面的例子能夠看出來,map是能夠遍歷數組中的每一項的,在這個題目中就是,當map遍歷數組中的每一項時,都會執行一次parseInt,傳遞給它兩個參數:當前項和對應的索引,而且把parseInt執行的返回結果替換數組中當前項,最後以新數組方式返回,原始數組不變ui

let arr = [1,2,3,4];
arr = arr.map(parsetInt);
console.log(arr);
 /* * arr = arr.map(parsetInt) => * arr = arr.map((item,index)=>{ * return parseInt(item,index) * }); */ 複製代碼

parseInt(item,index)

它能夠支持兩個參數:parseInt([value],[radix]):url

  1. [value]必須是string類型,若是不是默認要轉換爲string類型再進行處理;
  2. 第二個參數是一個進制的基數(2~36之間),把[value]當作[radix]進制,最後轉換爲10進制的數字;
  • 第二個參數不寫,默認是10,可是若是[value]是以0x開頭的字符串,默認的[radix]是16
  • [radix]設置爲0和設置10是同樣的,可是除此以外,只要不在2~36之間,返回的結果都是NaN

parsetInt的理解:spa

  1. parseInt中第一個參數是基本數據類型
parseInt('12px');
/* * => 第二個參數默認是10: parseInt('12px',10) * => 接下來找字符串中符合10進制的值,從左到右找,遇到一個非10進制的值,則結束查找(不論後面是否還有,都不在查找了) * => 遇到不是10進制是中止查找,所以查找到的就是:'12' * => 再把找到的結果轉換爲10進制的數字 * => 最後結果:12 */ 
複製代碼
parseInt('12px',0) => 12   //第二個參數是0,和10是同樣的,所以按照10進制查找便可
 parseInt('12px',1) => NaN  //第二個參數是1,不在2~36之間,因此是NaN
複製代碼
  1. parseInt中第一個參數是引用數據類型
parseInt([10,20,30])
// 把數組變爲字符串,再把radix補充
// => parseInt('10,20,30',10)
// 找符合10進制的內容
// => '10'
// 最後轉換爲10進制
// => 10
複製代碼

把其它進制轉換爲二進制和十進制

  1. 把其它進制轉換爲二進制:除以2取餘數,用上一次除數的結果在除以2取餘數...一步步的操做便可,一直到除完的結果是零爲止,最後把全部的餘數倒着拼接在一塊兒便可
// 把n轉爲二進制
let n = 32;
/* * 32/2 => 16 餘數:0 * 16/2 => 8 餘數:0 * 8/2 => 4 餘數:0 * 4/2 => 2 餘數:0 * 2/2 => 1 餘數:0 * 1/2 => 0 餘數:1 * 倒着把全部的值拼接起來就是轉換爲二進制的值 * (32).toString(2) 這也是直接轉換爲二進制 => "100000" */
複製代碼

2.把其它進制N轉換爲10進制:按照當前位的權重,計算對應的方來求出結果code

let n = 2057; //按照八進制 => 十進制
// 2*8^3 + 0*8^2+ 5*8^1 + 7*8^0
// 1024 + 0 + 40 + 7 => 1071 
複製代碼
let n = '23AF'; //把16進制轉換爲十進制
// 2*16^3 + 3*16^2 + A(10)*16^1 + F(15)*16^0
// 8192 + 768 + 160 + 15 =>9135
複製代碼
let n = 12.21; //三進制轉換爲十進制
//1*3^1 + 2*3^0 + 2*3^-1 + 1*3^-2
// 3 + 2 + 2*(1/3) + 1*(1/(3*3)) => 5.777777777777778
複製代碼

返回改題

/* * parseInt(1,0) => 1 => 10進制的1轉爲10進制仍是1 * parseInt(2,1) => NaN => 1不在2~36的範圍內,直接返回NaN * parseInt(3,2) => parseInt('3',2) => NaN => 字符串中並無符合2進制的值 * parseInt(4,3) => parseInt('4',3) => NaN => 字符串中並無符合3進制的值 */
複製代碼

3. 引伸題目(看一下是否真的掌握該類型)

let arr = [10.18, 0, 10, 25, 23];
arr = arr.map(parseInt);
console.log(arr);
複製代碼

步驟:索引

  • 肯定第二個參數(0和10都是10進制,2~36是對應的進制,只要不在2~36之間,返回的結果都是NaN)
  • 找到符合第二參數中進制的值(遇到不符合該進制的就中止查找)
  • 將它轉爲數字類型
  • 轉爲十進制 (利用進制的轉換)
  • 輸出結果
/* * parseInt(10.18,0) => parseInt('10.18',10) => parseInt('10',10) => 10 * parseInt(0,1) => NaN * parseInt(10,2) => parseInt('10',2) => parseInt('10',2) => 0*2^0 + 1*2^1 => 2 * parseInt(25,3) => parseInt('25',3) => parseInt('2',3) => 2*3^0 => 2 * parseInt(23,4) => parseInt('23',4) => parseInt('23',4) => 3*4^0 + 2*4^1 => 11 */
複製代碼
相關文章
相關標籤/搜索