2011-08-19 32 views
6

Dường như tôi không hiểu ý nghĩa của từ khóa in trong JavaScript.Lặp lại trên các mảng Javascript bằng từ khóa "trong"

Hãy nhìn vào đoạn mã này mã (http://jsfiddle.net/3LPZq/):

var x = [1,2] 
for(i in x){ 
    document.write(x[i]); 
} 

Khi chạy trong jsfiddle, nó in không chỉ các giá trị chứa trong mảng, mà còn tất cả các thuộc tính và phương pháp đối tượng mảng.

Khi tôi thay đổi nó như thế này (http://jsfiddle.net/4abmt/):

$(document).ready(function(){ 
var x = [1,2] 
for(i in x){ 
    document.write(x[i]); 
}}); 

nó in chỉ có giá trị 1 và 2.

Tại sao điều này xảy ra? Đây có phải là do jQuery hoặc hành vi của từ khóa in phụ thuộc vào việc liệu tài liệu có được nạp đầy đủ hay không?

+1

Trong ví dụ đầu tiên bạn có Mootools được chọn làm thư viện (có vẻ như mở rộng nguyên mẫu). Nếu bạn không chọn bất kỳ thư viện nào, kết quả là: http://jsfiddle.net/fkling/3LPZq/6/. Nhưng lưu ý rằng thực hành không tốt là sử dụng 'for ... in' để lặp qua mảng. –

Trả lời

2

Một số thư viện được tải bởi jsFiddle mở rộng nguyên mẫu mặc định của Array, do đó nó hiển thị các hàm bổ sung này. jQuery không mở rộng nguyên mẫu Array và vì vậy bạn không thấy bất kỳ hàm bổ sung nào.

+0

Cảm ơn! Điều đó trả lời câu hỏi của tôi. –

3

Điều này xảy ra do kế thừa mẫu thử nghiệm. Một đối tượng không chỉ hiển thị các thuộc tính riêng của nó, mà là tất cả các đặc tính tổ tiên của nó.

Để chỉ tìm thuộc tính của riêng đối tượng, hãy sử dụng obj.hasOwnProperty(prop).

var x = [1,2]; 
for (var i in x) { 
    if (x.hasOwnProperty(i)) { 
     document.write(x[i]); 
    } 
} 

Xem Tài liệu MDN trên hasOwnProperty.

+0

Tôi nhận được nó, nhưng sau đó tại sao trong ví dụ thứ hai nó chỉ in 1 và 2 và không có thuộc tính Array nào khác? –

+0

+1, chắc chắn là cách lặp lại chính xác đối tượng. – Exelian

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