map parseInt(筆試題筆記)

參考連接

map的使用
parseInt的使用javascript

在作筆試題時遇到這樣下面這樣一個問題java

['103','101','1000010'].map(parseInt)
複製代碼

一開始,想固然地覺得輸出結果是103,101,1000010。 但當咱們使用控制檯輸出時,眉頭一皺,發現事情並無那麼簡單:數組

[101, NaN, 66] // output
複製代碼

咱們來看一下MDN上關於map方法的介紹bash

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

map

map接收兩個參數,一個是callback,一個是this.函數

  1. callbackui

    生成新數組元素的函數,使用三個參數:
    currentValue--->callback表示數組中正在處理的當前元素,necessary必選參數。this

    index--->callback 數組中正在處理的當前元素的索引,可選參數。spa

    array--->callback方法被調用的數組,可選參數。code

  2. thisArg可選對象

    執行callback 函數時使用的this 值,若是省略,則值爲undefined。若是this的值爲null或者undefined則默認指向window.

經過下面這個例子咱們就能大體掌握map的用法。

var numbers = [1, 4, 9];
var roots = numbers.map(Math.sqrt);
// roots的值爲[1, 2, 3], numbers的值仍爲[1, 4, 9]
複製代碼

接下來,咱們再回顧一下這樣一個知識點:

參數傳遞

Javascript中的函數可使用任意數量的參數調用,即便它們不等於聲明的函數參數的數量。缺乏的參數被視爲未定義,而多餘的參數會被忽略(但會存儲在相似數組的參數對象中)。*

function foo(x, y) {
    console.log(x);
    console.log(y);
}
foo(1, 2);      // 1, 2
foo(1);         // 1, undefined
foo(1, 2, 3);   // 1, 2
複製代碼

parseInt

咱們注意到在Number原型上也有一個parseInt方法,全局對象上也有一個parseInt方法。那他們兩個之間存在什麼關係呢?

Number.parseInt === parseInt   // 輸出爲true
複製代碼

說明兩個指向同一個對象。


parseInt的用法

parseInt有兩個參數:stringradix(進制)。若是提供的radix(進制)爲空或者爲假值,進制(基數)默認設置爲10。radix 爲介於2-36之間的數。

有了上面的知識,咱們再回過頭來看這道筆試題:

['103','101','1000010'].map(parseInt)
複製代碼

咱們來分析一下,它的執行流程:

上面的寫法與下面實際上是等價的

['103','101','1000010'].map(parseInt(currentValue,index,['103','101','1000010']))
複製代碼

第一次循環

parseInt('103',0,['103','101','1000010'])//由於0是假,因此使用默認`radix`爲10,對於['103','101','1000010']這個多餘的參數則會被忽略,因此輸出103
複製代碼

第二次循環

parseInt('101',1,['103','101','1000010'])//radix 爲介於2-36之間的數。當radix===1時會返回NaN

//
parseInt('0000000',1)
複製代碼

第三次循環

parseInt('1000010',2,['103','101','1000010'])// 字符串則會被當成是二進制字符串解析,因此輸出66
複製代碼

parseInt的注意事項

咱們來看這樣一個例子:

parseInt('12345',4)   //這個題目會輸出什麼呢?
複製代碼

在四進制中,是不存在45的,那麼parseInt會對其進行怎樣的處理呢?

parseInt('12345',4) // 輸出27   3*4^0+2*4^1+1*4^2=27
複製代碼

基於此,咱們能夠合理推測parseInt會忽略大於等於4的字符。

那若是string後面還出現了小於4的字符呢?好比

parseInt('1234331',4)// 一樣輸出27
複製代碼

基於此,咱們能夠作出這樣的推論,只要在字符串中出現大於等於radix的數值,字符串就會今後位置開始被截斷,parseInt會忽略後面的字符。

經過這道筆試題,讓我更加發現了本身的不足,之後要繼續加油。

相關文章
相關標籤/搜索