Dari Jaringan Pengembang Mozilla :
[1,4,9].map(Math.sqrt)
akan menghasilkan:
[1,2,3]
Lalu mengapa melakukan ini:
['1','2','3'].map(parseInt)
hasilkan ini:
[1, NaN, NaN]
Saya telah menguji di Firefox 3.0.1 dan Chrome 0.3 dan hanya sebagai penafian, saya tahu ini bukan fungsi lintas-browser (tidak ada IE).
Saya menemukan bahwa yang berikut ini akan mencapai efek yang diinginkan. Namun, itu masih tidak menjelaskan perilaku bandel parseInt
.
['1','2','3'].map(function(i){return +i;}) // returns [1,2,3]
javascript
brad
sumber
sumber
.map(parseFloat)
karena hanya menggunakan satu parameter..map(Number)
.Jawaban:
Fungsi panggilan balik di
Array.map
memiliki tiga parameter:Dari halaman Mozilla yang sama dengan yang Anda tautkan:
Jadi jika Anda memanggil fungsi
parseInt
yang sebenarnya mengharapkan dua argumen, argumen kedua akan menjadi indeks elemen.Dalam hal ini, Anda akhirnya memanggil
parseInt
dengan radix 0, 1 dan 2 secara bergantian. Yang pertama sama dengan tidak memasok parameter, sehingga default berdasarkan input (basis 10, dalam hal ini). Basis 1 adalah basis angka yang tidak mungkin, dan 3 bukan angka yang valid di basis 2:Jadi dalam hal ini, Anda memerlukan fungsi wrapper:
atau dengan sintaks ES2015 +:
(Dalam kedua kasus, yang terbaik adalah secara eksplisit memasok radix
parseInt
seperti yang ditunjukkan, karena jika tidak menebak radix berdasarkan input. Pada beberapa browser yang lebih lama, 0 yang memimpin menyebabkannya menebak oktal, yang cenderung bermasalah. Itu masih akan bermasalah. tebak hex jika string dimulai dengan0x
.)sumber
map
sedang menyampaikan argumen ke - 2, yang (dalam banyak kasus) mengacaukanparseInt
parameter radix.Jika Anda menggunakan garis bawah yang dapat Anda lakukan:
['10','1','100'].map(_.partial(parseInt, _, 10))
Atau tanpa garis bawah:
['10','1','100'].map(function(x) { return parseInt(x, 10); });
sumber
Anda bisa menyelesaikan masalah ini menggunakan Number as iteratee function:
Tanpa operator baru, Number dapat digunakan untuk melakukan konversi tipe. Namun, ini berbeda dari parseInt: tidak mem-parsing string dan mengembalikan NaN jika jumlahnya tidak dapat dikonversi. Misalnya:
sumber
Saya akan bertaruh bahwa ini adalah sesuatu yang funky yang terjadi dengan parameter ke-2 parseInt, radix. Mengapa ini melanggar dengan penggunaan Array.map dan tidak ketika Anda menyebutnya secara langsung, saya tidak tahu.
sumber
Anda dapat menggunakan fungsi panah ES2015 / ES6 dan hanya meneruskan nomor ke parseInt. Nilai default untuk radix adalah 10
Atau Anda dapat secara eksplisit menentukan radix untuk keterbacaan kode yang lebih baik.
Dalam contoh di atas, radix secara eksplisit diatur ke 10
sumber
perbaikan cepat lain (yang berfungsi):
sumber
parseInt
IMHO harus dihindari karena alasan ini. Anda dapat membungkusnya untuk membuatnya lebih aman dalam konteks ini seperti ini:lodash / fp caps iteratee argumen ke 1 secara default untuk menghindari gotcha ini. Secara pribadi saya telah menemukan solusi untuk membuat bug sebanyak yang mereka hindari. Daftar hitam
parseInt
untuk implementasi yang lebih aman, saya pikir, merupakan pendekatan yang lebih baik.sumber