2016-01-21 11 views
7

tôi thấy hành vi kỳ lạ (thử nghiệm tại Chrome)(mảng mới (x)) bản đồ stranges

[1,2].map(function() { console.log(arguments); }) 
// [1, 0, Array[2]] 
// [2, 1, Array[2]] 
// [undefined, undefined] 

và đó là ok - ok như trong tài liệu hướng dẫn Nhưng

(new Array(20)).map(function() { console.log(arguments); }) 
//[undefined × 20] 

Nó doesn' t sử dụng gọi lại (không có hành động, debugger bên trong không hoạt động, vv). Tại sao??

Cú pháp new Array(arrayLength) sẽ tạo mảng có độ dài nhất định. Và nó có. Nhưng những gì với .map?

Trả lời

8

Từ MDN:

callback được gọi duy nhất cho chỉ số của mảng mà đã gán giá trị, trong đó có xác định. Nó không được gọi là thiếu các phần tử của mảng (có nghĩa là, các chỉ mục chưa bao giờ được đặt, đã bị xóa hoặc chưa bao giờ được gán giá trị).

Khi bạn khai báo một mảng sử dụng new Array(), tất cả các yếu tố này là không xác định, nhưng họ đã không giaoundefined như một giá trị . Do đó, họ bị bỏ qua trong cuộc gọi đến map().

Bạn có thể sử dụng join()split() gán một cách rõ ràng undefined để mỗi phần tử, và sau đó bạn sẽ nhận được kết quả mong muốn:

(new Array(20).join(undefined).split(undefined)).map(function() { console.log(arguments); })

+1

Hehe .. Bạn đánh tôi với nó: -) – Amit

+0

Thanh lịch hơn trong ES6: '[... Mảng (20)]. Bản đồ (hàm (... args) {console.log (args);})' – nils

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