2016-01-26 20 views
7

tôi đã nhận thấy rằng nếu tôi làm:Sự khác biệt giữa mảng (n) và mảng (n) .fill?

Array(n).map(() => console.log('test')) 

Tuy nhiên nếu tôi làm:

Array(n).fill().map(() => console.log('test')) 

tôi nhận được test in ra n lần.

Tại sao lại xảy ra trường hợp này? Nếu tôi làm Array(n).length tôi quay lại n.

Tôi nhận thấy trong REPL rằng Array(5) lợi nhuận:

[ , , , , ]

Trong khi Array(5).fill() lợi nhuận:

[ undefined, undefined, undefined, undefined, undefined ]

Trong cả hai trường hợp, typeof bất kỳ yếu tố trong mảng === undefined.

Vì vậy, những gì đang xảy ra?

Trả lời

10

map chỉ hoạt động trên các thuộc tính nguyên được xác định của một mảng. Array(n) không đặt thuộc tính nguyên, trong khi Array(n).fill(). Có sự khác biệt giữa thuộc tính không tồn tạithuộc tính hiện có có giá trị là undefined.

Array(n) đặt thuộc tính length của mảng, nhưng không đặt bất kỳ thuộc tính nào. Đối tượng mảng không có bất kỳ thuộc tính số nguyên nào.

.fill đặt tất cả các thuộc tính số nguyên cho một mảng từ 0 đến 1 ít hơn length. Khi bạn thực hiện Array(n) bạn đặt thuộc tính length của aray mới và sau đó .fill() xác định và đặt mỗi thuộc tính số nguyên lên đến n-1. Mảng được tạo bởi Array(n).fill()hiện có các thuộc tính được xác định tối đa length - 1. (Các tính chất tình cờ được thiết lập để undefined, bởi vì bạn đã không vượt qua một cuộc tranh cãi để fill, nhưng họ thực sự tồn tại.)

Về pracitcal, bạn có thể thấy sự khác biệt nếu bạn làm Object.keys(Array(4)) (mảng trống) so với Object.keys(Array(4).fill()) (danh sách các chuỗi "0" đến "3"). Trong trường hợp đầu tiên, các thuộc tính không tồn tại; trong trường hợp thứ hai họ làm.

3

Array(n) tạo mảng mới có kích thước n, nội dung chưa được xác định.

Array(n).fill() tạo một mảng có kích thước n trong đó mọi phần tử được đặt thành bất kỳ thứ gì bạn đã chuyển vào điền hoặc không được xác định trong trường hợp của bạn kể từ khi bạn không chuyển được gì.

Array(n).fill('test') tạo một mảng có kích thước n chứa 'thử nghiệm'.

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