2011-11-23 35 views
40

Hãy xem xét ví dụ này mã Javascript:Javascript khai mảng: Mảng mới(), Array mới (3), [ 'a', 'b', 'c'] tạo mảng mà hành xử khác nhau

a = new Array(); 
a['a1']='foo'; 
a['a2']='bar'; 

b = new Array(2); 
b['b1']='foo'; 
b['b2']='bar'; 

c=['c1','c2','c3']; 

console.log(a); 
console.log(b); 
console.log(c); 

Kết quả trong Firebug console như sau:

Đối với một (các '[]' phải được mở rộng bằng cách nhấp vào nút '+'):

[]  
a1 "foo" 
a2 "bar" 

Đối với b:

[undefined, undefined] 

Đối với c:

["c1", "c2", "c3"] 

Câu hỏi của tôi là:

  1. Tôi có sử dụng mảng [ 'chìa khóa'] = 'giá trị' cú pháp chính xác?
  2. Tại sao mảng không hoạt động như mong đợi?
  3. Tại sao mảng a và c hiển thị khác nhau trong bảng điều khiển? Dường như jQuery không thể lặp qua mảng với phương thức .each() của nó.
  4. Bạn có thể giới thiệu lại bất kỳ hướng dẫn hay về hành vi mảng Javascript không?

LƯU Ý: Firebug của Google Chrome chỉ hiển thị [] cho mảng 'a', không có tùy chọn mở rộng.

EDIT: Được rồi, có vẻ như các mảng trong Javascript chỉ có các phím số, vì vậy việc thêm chuỗi làm tên khóa làm cho đối tượng ra khỏi mảng. Nhưng tại sao jQuery không làm việc với nó?

$.each(a, function() 
    { 
    alert ('derp'); 
    }) 

Mã này, được thêm vào tập lệnh, không tạo ra cảnh báo.

+1

Bạn đang bối rối đối tượng mảng JavaScript với mảng liên kết có sẵn bằng các ngôn ngữ như PHP. Các mảng JavaScript chỉ sử dụng các chỉ số dạng số. Sử dụng cú pháp 'a ['a1'] = val' thêm thuộc tính' a1' vào đối tượng 'a', không phải giá trị mảng. –

+0

@ P.Brian.Mackey: Có lẽ vì loại câu hỏi này đã được hỏi nhiều lần về SO. – RightSaidFred

+1

@exizt: Firebug và các công cụ tương tự đưa ra các giả định về những gì bạn muốn hiển thị. Họ không nhất thiết phải là một đại diện của ngôn ngữ, mặc dù như được trả lời dưới đây, nó là * thường * tốt nhất để chỉ dựa vào các thuộc tính số trong các mảng JavaScript. – RightSaidFred

Trả lời

53

Mảng có chỉ mục bằng số. Vì vậy,

a = new Array(); 
a['a1']='foo'; 
a['a2']='bar'; 

and 

b = new Array(2); 
b['b1']='foo'; 
b['b2']='bar'; 

không thêm yếu tố để các mảng, nhưng thêm .a1.a2 thuộc tính cho đối tượng a (mảng là đối tượng quá). Làm bằng chứng hơn nữa, nếu bạn đã làm điều này:

a = new Array(); 
a['a1']='foo'; 
a['a2']='bar'; 
console.log(a.length); // outputs zero because there are no items in the array 

tùy chọn thứ ba của bạn:

c=['c1','c2','c3']; 

được gán biến c một mảng với ba yếu tố. Ba yếu tố đó có thể được truy cập dưới dạng: c[0], c[1]c[2]. Nói cách khác, c[0] === 'c1'c.length === 3.

Javascript không sử dụng chức năng mảng của nó cho những ngôn ngữ khác gọi mảng kết hợp nơi bạn có thể sử dụng bất kỳ loại khóa nào trong mảng. Bạn có thể thực hiện hầu hết các chức năng của một mảng kết hợp bằng cách chỉ sử dụng một đối tượng trong javascript nơi mỗi mục chỉ là một thuộc tính như thế này.

a = {}; 
a['a1']='foo'; 
a['a2']='bar'; 

Thường là sai lầm khi sử dụng một mảng cho mục đích này vì nó chỉ gây nhầm lẫn cho người đọc mã của bạn và dẫn đến giả định sai về cách mã hoạt động.

+2

Và liên quan đến sự khác biệt giữa 'a' và' b', tôi nghĩ nó xuất phát từ khai báo 'b = new Array (2);'. Ở đây bạn đang nói "mảng số được lập chỉ mục của tôi có 2 mục". Và kể từ khi bạn đang đặt không có gì vào 'b [0]' và 'b [1]', điều đó giải thích 2 'undefined' bạn nhận được trong Firebug. – Rodolphe

+0

Tôi hiểu, cảm ơn! Nhưng tại sao jQuery không.() Làm việc với mảng 'a'? (Xem chỉnh sửa) – sbichenko

+0

Thật thú vị khi lưu ý cách firebug đối xử như một đối tượng chứa phần tử mảng. Tuy nhiên, nó xử lý b như một mảng không có thuộc tính nhìn thấy được (mặc dù các thuộc tính tồn tại). Trường hợp khác biệt duy nhất là tham số được truyền cho hàm tạo mảng. Tôi tự hỏi tại sao đây là? –

3

Mảng trong JS có hai loại thuộc tính:

yếu tố thường xuyên và tính chất kết hợp (trong đó là gì, nhưng các đối tượng)

Khi bạn xác định a = new Array(), bạn đang xác định một mảng trống. Lưu ý rằng không có đối tượng liên kết nào được nêu ra

Khi bạn xác định b = new Array(2), bạn xác định một mảng có hai vị trí không xác định.

Trong cả hai ví dụ về 'a' và 'b', bạn sẽ thêm các thuộc tính liên kết tức là đối tượng vào các mảng này.

console.log (a) hoặc console.log(b) in các phần tử mảng, tức là lần lượt là [][undefined, undefined]. Nhưng kể từ a1/a2b1/b2 là các đối tượng liên kết bên trong mảng của chúng, chúng có thể được ghi chỉ bằng console.log(a.a1, a.a2) loại cú pháp

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