­

【面試題】439- 這是一道網紅面試題

  • 2019 年 12 月 24 日
  • 筆記

在騰訊和百度的面試中,出現了這樣一道面試題,,被大家親切的稱呼為網紅面試題,這道面試題就是。['1', '2', '3'].map(parseInt)的輸出結果是什麼?['1', '2', '3'].fliter(parseInt)的輸出結果是什麼?這個面試題,面試官可能不僅僅需要你說出他的結果,還需要你知道為什麼會出現這樣的結果。

一、關鍵語法

1、parseInt

2、parseFloat

先看看parseInt和parseFloat的語法和使用,以便後續在實際例子中解釋。

二、Map

1、['1', '2', '3'].map(parseInt)

['1', '2', '3'].map(parseInt)  // [1, NaN, NaN]

其實在使用map時,map的callback的第二個參數index引索值就成為parseeInt的radix值。['1', '2', '3'].map(parseInt)在遍歷的過程。其實是經歷了下面的過程。

parseInt('1', 0);  parseInt('2', 1);  parseInt('3', 2);
  • parseInt('1', 0):radix的值為0,判斷字符串發現介於1~9,用10進制轉換,結果為1.
  • parseInt('2', 1):radix的值為1,如果該參數小於 2 或者大於 36,則 parseInt() 將返回 NaN。
  • parseInt('3', 2): radix的值為2,這就意味着字符串將被解析成位元組數,也就是僅僅包含數值0和1。parseInt的規範指出,它僅嘗試分析第一個字符的左側。這個字符串的第一個字符是「3」,它並不是基礎基數2的一個有效數字。所以這個子字符串將被解析為空。如果子字符串被解析成空了,函數將返回為NaN。

2、['1', '2', '3'].map(parseFloat)

['1', '2', '3'].map(parseFloat)  // [1, 2, 3]

parseFloat相對於parseInt比較簡單,不用考慮第二個參數,只需要看第一個參數是否能正常轉換為數字就行。

parseFloat('1');  // 1  parseFloat('2');  // 2  parseFloat('3');  // 3

一個小的知識點:如何快速將一個字符串數組轉化為數字類型的數組

['1', '2', '3'].map(parseFloat)  ['1', '2', '3'].map(Number)

三、filter

1、['1', '2', '3'].filter(parseInt)

['1', '2', '3'].filter(parseInt)  // ["1"]

filter 為數組中的每個元素調用一次 callback 函數,並利用所有使得 callback 返回 true 或等價於 true 的值的元素創建一個新數組。

parseInt('1', 0);  parseInt('2', 1);  parseInt('3', 2);
  • parseInt('1', 0):radix的值為0,判斷字符串發現介於1~9,用10進制轉換,結果為1,所以callback的結果等價於true,返回元素'1'。
  • parseInt('2', 1):radix的值為1,如果該參數小於 2 或者大於 36,則 parseInt() 將返回 NaN,結果不等價於true,不返回。
  • parseInt('3', 2): radix的值為2,這就意味着字符串將被解析成位元組數,也就是僅僅包含數值0和1。parseInt的規範指出,它僅嘗試分析第一個字符的左側。這個字符串的第一個字符是「3」,它並不是基礎基數2的一個有效數字。所以這個子字符串將被解析為空。如果子字符串被解析成空了,函數將返回為NaN。

2、['1', '2', '3'].filter(parseFloat)

['1', '2', '3'].filter(parseFloat)  // ["1", "2", "3"]

使用parseFloat時,遍歷之後結果的每一項都是結果等價於true,所以全部返回。

四、反思

通過上述的map、filter,我們聯想到數組其他方法,當使用parseInt或者是parseFloat來替代callback使用,你只需要理解到parseInt和parseFloat工作原理,那麼針對這類問題,其實結果都是能很快輸出的,也能套用上面的解析過來,來回答面試官。這類面試題也不是什麼難題了。

源自:https://juejin.im/post/5dbff8735188252ddb2fd25e

聲明:文章著作權歸作者所有,如有侵權,請聯繫小編刪除。