2013-05-18 24 views
5

Tại sao điều này xảy ra?parseTiếp tục không đúng khi được chuyển làm đối số cho cuộc gọi bản đồ

var numbers = [ '1', '2', '3', '4' ]; 
var intNumbers = numbers.map(parseInt); // intNumbers = [1, NaN, NaN, NaN] 
var fltNumbers = numbers.map(parseFloat); // fltNumbers = [1, 2, 3, 4, 5 ] 

Nhưng Array.prototype.map.call(numbers, parseInt); trả về [ 1, 2, 3, 4];. Tôi đang chạy mã này trong Google Chrome 26.0.1410.65.

+6

giải thích tại https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/map –

+0

cũng đơn giản sửa chữa: 'numbers.map (function (i) {return parseInt (i)}) ' – Jonah

+0

Ngoài ra, đừng quên * luôn luôn * chuyển tham số radix thành' parseInt() 'và đặt nó thành' 10' nếu bạn đang sử dụng cơ sở 10, bởi vì, nếu không, bạn có thể gặp phải vấn đề lạ và rất khó để gỡ lỗi sau này. – rid

Trả lời

4

Các liên kết đến câu trả lời đúng được đưa ra trong các ý kiến, nhưng tôi muốn đăng nó ở đây :

["1", "2", "3"].map(parseInt); 

Trong khi người ta có thể mong đợi [1, 2, 3]

Kết quả thực tế là [1, NaN, NaN]

parseInt thường được sử dụng với một đối số, nhưng phải mất hai. Thứ hai là radix Để chức năng gọi lại, Array.prototype.map đi 3 luận: nguyên tố này, chỉ số, các mảng

Đối số thứ ba được bỏ qua bởi parseInt, nhưng không phải là người thứ hai, do đó sự nhầm lẫn có thể xảy ra.

Nhanh chóng khắc phục

function returnInt(element){ 
    return parseInt(element,10); 
} 


["1", "2", "3"].map(returnInt); 

kết quả thực tế là một mảng các số (như mong đợi)

0

https://developer.mozilla.org/en-GB/docs/JavaScript/Reference/Global_Objects/Array/map giải thích bản đồ các công trình như thế nào.

Tôi tìm thấy nó dễ dàng hơn với các giải pháp mà Jonah đề xuất, tạo ra một hàm trả về cho điều bạn muốn ánh xạ thay vì tung nó ..

intN = numbers.map(function(i) { return parseInt(i) }); 

Lý do thực sự là bạn đang cố gắng để nuôi một chức năng để ánh xạ, nhưng JS không nhận được hàm đúng.

Bạn nên khai báo hàm này trước và sau đó nạp nó.

var titi = function(i) { return parseInt(i); }; 

var intN2 = numbers.map(titi); 
+1

Không cần khai báo trước. Bạn chỉ cần không sử dụng 'parseInt' trực tiếp. –

Các vấn đề liên quan