2011-03-18 31 views
6

Tôi nghĩ tôi biết cách khai báo các mảng javascript nhưng trong tập lệnh này, tôi nhận được một vòng lặp vô hạn gồm các phần tử undefined trong mảng.Mảng Javascript chỉ chứa không xác định sau khi khởi tạo, không phải giá trị đã cho

Tôi khai báo ba mảng số, hai trong số đó có nhiều giá trị và một trong số đó có một giá trị.

Tôi có một câu lệnh switch mà chỉ định một trong ba mảng để một tên biến mới cluster_array

Khi tôi chạy một vòng lặp for qua cluster_array, tôi nhận được một vòng lặp vô hạn và mọi phần tử nếu undefined

gì tôi có bị mất không?

<script type="text/javascript"> 
    var ga_west_cluster = new Array(10,11,12,14,74,75,76,77,78,79,80,81,82,83,85,86,87,88,89,90,91,92,295,296); 

// original bad array 
    var ga_east_cluster = new Array(84); 
// added an extra (dummy) value and it works fine 
    var ga_east_cluster = new Array(1,84); 
    var sc_cluster  = new Array(93,94,95,96,97,98,99,100,101,102,103); 
</script> 

Dưới đây là nội dung alert:

var test_message  = "cluster data\n"; 
    for(var k=0;k<cluster_array.length;k++) 
     test_message += "value: "+cluster_array[k]+"\n"; 

test alert box

+0

bạn có thể dán câu lệnh chuyển đổi của mình không? – moe

+0

@moe nó chỉ ra rằng tôi đã tuyên bố mảng sai cách, mỗi @ câu trả lời của Pointy – Patrick

Trả lời

14

Đừng khởi tạo mảng như thế. Luôn thực hiện việc này thay thế:

var myarray = [value, value, value, ... ]; 

Hàm tạo "Array()" được thiết kế khủng khiếp. Dạng đối số đơn lẻ, khi đối số là một số, được hiểu là một yêu cầu để "khởi tạo" một mảng với nhiều giá trị "trống" đó. Đó là một điều vô nghĩa để làm, vì vậy nói chung bạn tốt hơn hết bằng cách sử dụng ký hiệu hằng số mảng (như trong ví dụ của tôi ở trên). Nó dường như không xảy ra nữa trong các trình duyệt hiện đại, nhưng tôi thề rằng có ít nhất một số trình duyệt thực sự cấp phát bộ nhớ cho hàm tạo đối số đơn, điều này không thực sự hữu ích nhưng nguy hiểm đối với các trình duyệt hiện tại. mã có thể vô tình truyền vào một số rất lớn.

+0

constructor 'Array' vẫn có thể hữu ích. Ví dụ, nó có thể được sử dụng để tạo ra các vòng mà mỗi giá trị trả về được tích lũy trong một mảng. Vì vậy, điều này .. 'new Array (4) .fill(). Map ((v, i) => i)' sẽ trả về mảng '[0, 1, 2, 3]' – Molomby

+0

@Molomby yes đó là lời khuyên tốt; câu trả lời này là hơn 6 tuổi, và đó là mãi mãi trong thời gian JavaScript :) – Pointy

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