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
接收兩個參數,一個是callback
,一個是this
.函數
callbackui
生成新數組元素的函數,使用三個參數:
currentValue--->callback
表示數組中正在處理的當前元素,necessary
必選參數。this
index--->callback
數組中正在處理的當前元素的索引,可選參數。spa
array--->callback
方法被調用的數組,可選參數。code
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
複製代碼
咱們注意到在Number
原型上也有一個parseInt
方法,全局對象上也有一個parseInt
方法。那他們兩個之間存在什麼關係呢?
Number.parseInt === parseInt // 輸出爲true
複製代碼
說明兩個指向同一個對象。
parseInt
有兩個參數:string
和radix
(進制)。若是提供的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('12345',4) //這個題目會輸出什麼呢?
複製代碼
在四進制中,是不存在4
和5
的,那麼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會忽略後面的字符。
經過這道筆試題,讓我更加發現了本身的不足,之後要繼續加油。