2011-12-25 39 views
30

Tại sao sử dụng chuỗi làm khóa của mảng, bảng điều khiển hiển thị mảng đó mà không có các giá trị được khai báo này và trong khi lặp lại bằng các giá trị này khi các chuỗi không được hiển thị? , mặc dù tôi có thể nhận được giá trị của chúng.Chuỗi dưới dạng các mảng của mảng trong javascript

>> var arr = [ 0, 1, 2, 3 ]; 
    undefined 

>> arr["something"] = "aught"; 
    "aught" 

>> arr 
    [0, 1, 2, 3] 

>> arr["something"] 
    "aught" 

>> for(var i = arr.length; i--; console.log(arr[ i ])); 
    3 
    2 
    1 
    0 

Tôi hiểu rằng mảng là đối tượng đã triển khai một số loại giao diện 'liệt kê' trong công cụ của javascript. Thú vị nhất là thông dịch viên không ném cảnh báo hoặc lỗi vì vậy tôi đã dành một vài thời gian tìm kiếm nơi dữ liệu có thể bị mất. tôi bây giờ, tôi đã sai và tôi đã sử dụng [] thay vì {}

Trả lời

69

Trong javascript có 2 loại mảng: mảng tiêu chuẩn và các mảng kết hợp

  • [ ] - mảng tiêu chuẩn - 0 chỉ số số nguyên chỉ dựa
  • { } - đối tượng mảng - đối tượng javascript trong đó khóa có thể là bất kỳ chuỗi nào

Vì vậy, khi bạn xác định:

var arr = [ 0, 1, 2, 3 ]; 

bạn xác định một mảng tiêu chuẩn trong đó chỉ mục chỉ có thể là số nguyên. Khi bạn làm arr["something"] từ something (đó là những gì bạn sử dụng làm chỉ mục) không phải là số nguyên, bạn về cơ bản xác định thuộc tính cho đối tượng arr (mọi thứ đều là đối tượng trong javascript). Nhưng bạn không thêm một phần tử vào mảng tiêu chuẩn.

+2

@abuduba, bởi vì không có gì sai :-) Mã của bạn hoàn toàn hợp lệ javascript. Nó không rõ ràng đối với người đọc vì bạn đang trộn 2 loại mảng nhưng nó hợp lệ. Tại sao bạn muốn người phiên dịch chỉ ra rằng có điều gì đó sai trái khi không có gì sai. –

+18

Đây chủ yếu là một vấn đề về thuật ngữ, nhưng javascript thường KHÔNG gọi '{}' là một mảng kết hợp. Họ gọi nó là một đối tượng có thuộc tính. Không phải hầu hết mọi người đều đồng ý rằng tốt nhất là không nên nhầm lẫn mọi thứ bằng cách gọi một đối tượng javascript là một mảng kết hợp? – jfriend00

+1

Lưu ý: Nếu bạn cố gắng sử dụng '' defineProperty'' trên mảng như '' Object.defineProperty.call (arr, 'something', 'aught'); '' nó sẽ ném một lỗi. – David

9

for(var i = arr.length; i--; console.log(arr[ i ]));

này sẽ chỉ cung cấp cho bạn các chỉ số số, tất nhiên, nhưng bạn vẫn có thể lặp trên cả hai chỉ số số phím chuỗi các mảng của bạn như thế này:

for (var x in arr) { 
    console.log(x + ": " + arr[x]); 
} 
/* (console output): 
    0: 0 
    1: 1 
    2: 2 
    3: 3 
    something: aught 
*/ 
+1

như vậy, cho phép thêm này 'Array.prototype.somethingCool =" không thực sự ";' và sau đó chạy cho-in-loop của bạn !! – KhaledMohamedP

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