2010-04-15 20 views
8

này hoạt động tốt:JavaScript 1.6 Array.map() và Array.filter() không làm việc với xây dựng trong các chức năng như các đối số

["655971", "2343", "343"].map(function(x) { return parseInt(x) }) // [655971, 2343, 343] 

Nhưng doesnt này:

["655971", "2343", "343"].map(parseInt) // [655971, NaN, NaN] 

Cùng xảy ra cho Array.filter()

Tôi thiếu gì ở đây?

+0

Trong trường hợp có ai quan tâm, tình trạng này được mô tả một cách chi tiết, trên các [MDN 'Array.prototype .map' page] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map#Example:_Tricky_use_case) được tham chiếu bởi bài đăng blog sau: [Allen Wirfs -Brock - Nguy cơ đối số tùy chọn JavaScript] (http://www.wirfs-brock.com/allen/posts/166). –

Trả lời

20

Đó là vì map đi tranh luận hơn chỉ mục mảng vào hàm gọi lại. Bạn nhận được:

callback(item, index, array) 

Thông thường, chức năng của bạn sẽ bỏ qua các đối số không cần. Nhưng parseInt chấp nhận một tham số thứ hai tùy chọn:

parseInt(string, base) 

cho cuộc gọi đầu tiên, baseindex0. Điều đó hoạt động tốt vì ECMAScript xác định rằng base=0 giống như bỏ qua đối số và do đó cho phép thập phân, bát phân hoặc hex (sử dụng số thập phân trong trường hợp này).

Đối với mặt hàng thứ hai và thứ ba, base1 hoặc 2. Nó cố gắng phân tích cú pháp số là base-1 (không tồn tại) hoặc base-2 (nhị phân). Vì số đầu tiên trong chuỗi là một chữ số không tồn tại trong các căn cứ đó, bạn sẽ nhận được NaN.

Nói chung, parseInt mà không có một cơ sở là khá đáng ngờ nào, vì vậy bạn có thể muốn:

["655971", "2343", "343"].map(function(x) { return parseInt(x, 10) }) 
+0

Một tùy chọn khác (mặc dù có ngữ nghĩa khác nhau) trong một số trường hợp là sử dụng hàm 'Số'. Khi được gọi không có 'new', nó chuyển đổi đối số của nó thành một số, tương tự như toán tử' + 'đơn nhất. –

+0

(Yep ...'Số' hoặc' + 'là tốt, mặc dù chúng không đảm bảo đó là số nguyên.) – bobince

+0

chúng ta sẽ sử dụng + như thế nào? – bucabay

5

Vấn đề là map hy vọng rằng callback phải là một chức năng chấp nhận ba đối số, callbackfn(value, index, array).

Đối số thứ hai là xung đột với đối số radix của hàm parseInt(string, radix).

Bản đồ gọi parseInt như thế này cho mỗi yếu tố:

parseInt("655971",0); // 655971 
parseInt("2343", 1); // NaN 
parseInt("343", 2); // NaN 

Người đầu tiên làm việc bởi vì nếu radix là undefined hoặc 0, nó được giả định là 10

+0

muốn tôi có thể cho cả hai câu trả lời nhưng phải chọn câu trả lời đầu tiên. :) – bucabay

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