2017-03-29 15 views
7

xem xét Tôi tuyên bố hai biến như thế này (thực hiện trong vòng REPL, với v7.7.2 nút), mà tôi hy vọng sẽ được các mảng:Tạo một mảng - tại sao nó lại khác?

var x = Array(4) 
var y = Array.from({length: 4}) 

thì sau đây nên làm việc hệt, nhưng nó không:

x.map(Math.random) 
[ , , , ] 
y.map(Math.random) 
[ 0.46597917021676816, 
    0.3348459056304458, 
    0.2913995519428412, 
    0.8683430009997699 ] 

trong việc tìm kiếm, có vẻ như x và y đều giống hệt nhau:

> typeof x 
'object' 
> typeof y 
'object' 
> Array.isArray(x) 
true 
> Array.isArray(y) 
true 
> x.length 
4 
> y.length 
4 
> typeof x[0] 
'undefined' 
> typeof y[0] 
'undefined' 

vậy tại sao sự khác biệt?

+0

'Object.keys (x) 'vs' Object.keys (y)' chắc chắn là lý do. –

+0

nó sẽ không bao giờ xảy ra với tôi để tìm chìa khóa trong một mảng (được đưa ra như thế nào isArray() trả về true)! – ekkis

Trả lời

2

Đối với ba đầu ra đầu tiên, Array#map công trình.

Nó không được gọi cho các phần tử thiếu của mảng (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ị).

Tiêu chuẩn ECMA 262 cho Array.from mô tả công trình có độ dài cho mảng mới (điểm 7 ff).

var x = Array(4), 
 
    y = Array.from({ length: 4 }), 
 
    arrayX = x.map(Math.random), 
 
    arrayY = y.map(Math.random), 
 
    z = Array.from({ length: 4 }, Math.random); 
 

 
console.log(x); 
 
console.log(y); 
 
console.log(arrayX); 
 
console.log(arrayY); 
 
console.log(z);

4

Thực ra, không nên có kết quả giống nhau cho cả hai trường hợp. Xem hướng dẫn ở đây về Array:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array

Nếu đối số chỉ truyền cho constructor Mảng là một số nguyên giữa 0 và 232-1 (bao gồm), điều này trả về một mảng JavaScript mới với nó chiều dài bất động sản thiết lập để số đó (Lưu ý: điều này ngụ ý một mảng của mảngLength khe trống, không khe với thực tế undefined giá trị). Nếu đối số là bất kỳ số nào khác, một ngoại lệ RangeError được ném.

Và đây về phương pháp Array.from()

https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/from

Kiểm tra ví dụ sau đây trên trang liên kết ở trên:

// Generate a sequence of numbers 
// Since the array is initialized with `undefined` on each position, 
// the value of `v` below will be `undefined` 
Array.from({length: 5}, (v, i) => i); 
// [0, 1, 2, 3, 4] 
+0

vì vậy có sự khác biệt giữa một vị trí "trống" và một vị trí chứa * không xác định *? đoạn cuối cùng trong mã của tôi chỉ ra rằng 'typeof x [0] == typeof y [0]' là đúng. vì vậy làm thế nào tôi có thể nhận được sự khác biệt? – ekkis

1

Các mảng tạo ra với Array (4) không lặp qua với .map(), trong khi Array.from ({length: 4}) được lặp lại. Một lời giải thích đầy đủ hơn có thể được tìm thấy tại JavaScript "new Array(n)" and "Array.prototype.map" weirdness, bạn có thể kiểm tra điều này với ..

x.map((f,i) => console.log(i)) vs. y.map((f,i) => console.log(i)) 
+0

nói cách khác, đây là một bản sao chính xác? –

+0

Không phải là bản sao chính xác, nhưng nguyên nhân của vấn đề là như nhau. – user3094755

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