['1', '2', '3'].map(parseInt) what & why ?

這個題,首先要考慮兩個問題:
一、parseInt的函數的簽名
二、map的函數簽名,而後再考慮這兩個函數在一塊兒使用的時候,會有什麼結果數組

parseInt

parseInt() 函數解析一個字符串參數,並返回一個指定基數的整數 (數學系統的基礎)。瀏覽器

parseInt(param, radix) 至關於 parseInt(String(param).trim(), radix)函數

const value = parseInt(string[, radix]);
複製代碼

其中 string是一個要解析的字符串,若是不是字符串,則使用toString()方法給轉換成string,開頭的空格會被忽略。ui

radix是一個介於2-36的整數。表示一個基數,要將字符串轉換成這個基數的進制。默認是10。this

返回值是一個整數或者NaN。spa

parseInt(100) // 100
    parseInt(100, 10) //100
    parseInt(100, 2) // 4 由於100先轉成了'100',而後在2進制下,100就是4。
複製代碼

注意:code

在radix爲 undefined,或者radix爲 0 或者沒有指定的狀況下,JavaScript 做以下處理:索引

  • 若是字符串 string 以"0x"或者"0X"開頭, 則基數是16 (16進制).
  • 若是字符串 string 以"0"開頭, 基數是8(八進制)或者10(十進制),那麼具體是哪一個基數由實現環境決定。ECMAScript 5 規定使用10,可是並非全部的瀏覽器都遵循這個規定。所以,永遠都要明確給出radix參數的值。
  • 若是字符串 string 以其它任何值開頭,則基數是10 (十進制)。

radix 爲1或radix > 36時,返回值默認爲NaNip

map

map()方法建立一個新數組,其結果是該數組中的每一個元素都調用一個提供的函數後返回的結果。element

const new_array = arr.map(function callback(currentValue[,index[, array]]) {
     // Return element for new_array
     }[, thisArg])
複製代碼

能夠看到callback回調函數須要三個參數, 咱們一般只使用第一個參數 (其餘兩個參數是可選的)。

  • currentValue 是callback 數組中正在處理的當前元素。

  • index可選, 是callback 數組中正在處理的當前元素的索引。

  • array可選, 是callback map 方法被調用的數組。

  • 另外還有thisArg可選, 執行 callback 函數時使用的this 值。

    const arr = [1, 2, 3]; arr.map((num) => num + 1); // [2, 3, 4]

瞭解了這兩個函數的簽名,咱們再來看這個題目:

['1', '2', '3'].map(parseInt) 
複製代碼

這意味着,每一個map的迭代,都要給parseInt傳遞兩個參數,item和index,就是字符串和基數。

那這個表達式能夠寫成

['1', '2', '3'].map((item, index) => parseInt(item, index))
複製代碼

返回的結果應該是:

parseInt('1', 0) // 1 
    parseInt('2', 1) // NaN
    parseInt('3', 2) // NaN 由於3不是2進制裏的數,因此就報錯。
複製代碼

因此該表達式返回的數組爲:

['1', '2', '3'].map(parseInt)
    // [1, NaN, NaN]
複製代碼

加里·伯恩哈德例子也就很好解釋了,這裏再也不贅述

['10','10','10','10','10'].map(parseInt);
    // [10, NaN, 2, 3, 4]
複製代碼
相關文章
相關標籤/搜索