為什麼 [1, 7, 11].map(parseInt) 會回[1, NaN, 3]?

Hyman Chen
Hybrid Maker
Published in
2 min readJul 26, 2019

為什麼 [1, 7, 11].map(parseInt)會回[1, NaN, 3]?

我們先了解究竟 map 裡面做了什麼事情

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

callback為產生新陣列之元素的回呼函式,可傳入三個參數:

  1. currentValue原陣列目前所迭代處理中的元素。
  2. index選擇性原陣列目前所迭代處理中的元素之索引
  3. array選擇性呼叫 map 方法的陣列。

轉換之後會變成下面這樣

parseInt(1, 0, [1, 7, 11]);
parseInt(7, 1, [1, 7, 11]);
parseInt(11, 2, [1, 7, 11]);

看出端倪了嗎?

在了解一下 parseInt 所需要的參數

parseInt(string, radix);
  1. string待轉成數字的字串。若 string 參數類型不是字串的話,會先將其轉成字串(相當於先執行 ToString 再執行 parseInt)空白值會被忽略。
  2. radix從 2 到 36,能代表該進位系統的數字。例如說指定 10 就等於指定十進位。一定要定義這個參數以避免他人的困惑、也好預估函式的行為。如果沒有指定 radix 的話,給出的結果會按照實做不同而異,請注意,通常預設值不是 10 進位。
parseInt(1, 0, [1, 7, 11]);

因為第二個參數給 0 會預設當成 false, 系統自動十進位,所以產生答案是 1

parseInt(7, 1, [1, 7, 11]);

由於沒有 1 進位,所以答案會是 Nan

parseInt(11, 2, [1, 7, 11]);

11 的二進位代表的就是 3

總結

如果要用 parseInt 放進 map 裡面可以改用下面兩種寫法

[1, 7, 11].map(Number);[1, 7, 11].map(d=>parseInt(d));

--

--