2012-01-31 19 views
12

Vì vậy, tôi đang sử dụng này trong IE8:IE8 cho ... trong Enumerator

var hi=["hi", "lo", "foo", "bar"]; 
for(i in hi){console.log(i)}; 
//WTF is that indexOf i value? 
LOG: 0 
LOG: 1 
LOG: 2 
LOG: 3 
LOG: indexOf 
undefined 

Trong chrome và những người khác, tôi sẽ chỉ nhận được 0-3, không có bí ẩn "indexOf" điều. Tại sao và sửa lỗi là gì?

Trả lời

23

Không sử dụng for...in cho mảng. Tốt nhất là sử dụng vòng lặp for truyền thống trong trường hợp đó.

Lý do là vì for...in xem mảng dưới dạng đối tượng và do đó các thuộc tính như indexOf hoặc length có thể được bao gồm trong vòng lặp. Vòng lặp for bình thường chỉ đề cập đến các phím số, do đó, vấn đề này tránh được.

Trên ghi chú bên, các thuộc tính không mong muốn có thể hiển thị khi lặp qua các đối tượng thuần túy (như những người khác đã lưu ý, thuộc tính bạn thêm vào nguyên mẫu của đối tượng sẽ hiển thị). Bạn có thể làm được việc này bằng cách viết for...in vòng bạn theo cách này:

var obj = { ... }; 
for (var prop in obj) { 
    if (obj.hasOwnProperty(prop)) { 
    var item = obj[prop]; 
    ... 
    } 
} 

Để được rõ ràng mặc dù: bạn vẫn không nên sử dụng phương pháp này vào mảng.

+0

cảm ơn! Ninjas ... – randomor

7

Bạn đang sử dụng loại vòng lặp sai cho một mảng - for ... in ... cũng sẽ bao gồm bất kỳ thuộc tính enumerable nào của đối tượng, trong trường hợp của bạn bao gồm phương thức .indexOf().

Sử dụng này để thay thế:

var i, n = hi.length; 
for (i = 0; i < n; ++i) { 
    console.log(i, hi[i]); 
} 

Chrome và các trình duyệt khác lên ngày thực hiện ECMAScript 5, và đánh dấu chính xác tất cả các phương pháp tích hợp như không đếm được tài sản.

+1

Ha, chúng ta lại chiến đấu! – benekastah

+0

'indexOf' không phải là một phương thức mảng trong IE8, nó được thêm vào từ người dùng đó là lý do tại sao nó xuất hiện – Esailija

+0

IE8 không có' indexOf() '? wow ... – Alnitak

4

Điều này xảy ra do tập lệnh bạn đang đưa vào trang của mình đang thêm phương thức indexOf vào Array.prototype. Điều này có nghĩa là tất cả các mảng đều thừa hưởng phương thức indexOf, điều này là tốt, vì nó có nghĩa là bạn có thể sử dụng phương thức đó ngay cả trong IE8.

Nhưng, vì không có cách nào để đánh dấu thuộc tính là không liệt kê trong IE8, bạn sẽ thấy nó mỗi khi bạn liệt kê tất cả các thuộc tính của mảng, đó là những gì bạn làm trong một for - in vòng lặp. Bạn có thể muốn thay vào đó một vòng lặp for.