2009-10-26 29 views
8

JSLint tiếp tục phàn nàn về những thứ như thế nàyWrapping Vì trong vòng với câu lệnh if trong Javascript - Looping trên mảng

var myArray = [1, 2, 3]; 
for (var value in myArray) 
{ 
    // BLAH 
} 

Nói rằng tôi nên bọc nó trong một câu lệnh if. Tôi nhận ra bạn cần phải quấn nó nếu bạn đang looping trên một thuộc tính của đối tượng, nhưng ở đây những gì tôi nên đặt trong câu lệnh if để làm đúng lọc.

Ngoài ra khi tôi làm điều gì đó như

for (var i = 0; i < 10; i++) 
{ 
    // foo 
} 

for (var i =0; i < 20; i++) 
{ 
    // bar 
} 

Nó phàn nàn rằng tôi đã được xác định. Làm thế nào để ngăn chặn điều này ngoài việc sử dụng các tên biến khác nhau?

Trả lời

9

JSLint whinges về rất nhiều mà không thực sự có hại. Trong trường hợp này, nó có quyền khiếu nại về for...in, bởi vì đó là cấu trúc sai để lặp qua một mảng.

Điều này là do bạn sẽ nhận được không chỉ các phím số, mà còn bất kỳ thuộc tính tùy ý nào khác đã được thêm vào mảng hoặc Array.prototype của nó. Cái sau thường xuất phát từ các hàm tiện ích mở rộng được thêm vào bởi các khung công tác.

Trong khi bạn có thể đánh bại trường hợp đó với hasOwnProperty để kiểm tra xem đó không phải là thành viên mẫu thử nghiệm, nó xấu hơn là chỉ thực hiện theo cách phù hợp với for (var i= 0...) vậy tại sao phải bận tâm.

Ngoài ra, với for...in bạn sẽ không nhất thiết phải nhận các mục theo thứ tự số như bạn mong đợi.

Nó phàn nàn rằng tôi đã được xác định. Làm thế nào để ngăn chặn điều này ngoài việc sử dụng các tên biến khác nhau?

Vâng, bạn có thể bỏ qua điều đó.

Bạn muốn xóa var khỏi số for (i... thứ hai, vì việc khai báo biến hai lần trong cùng phạm vi sẽ không làm gì cả. Tuy nhiên tôi khuyên bạn nên rời khỏi var ở đó bởi vì nó không gây hại gì, và nếu bạn di chuyển vòng lặp đến khối khác, bạn không muốn nó đột nhiên viết nguệch ngoạc trên hình cầu.

8

Thực sự, bạn không phải nghe jslint. Nhưng nếu bạn thực sự muốn vượt qua (điều này thật hay) bạn có thể làm:

var myArray = [1, 2, 3]; 
for (var value in myArray) 
{ 
    if (myArray.hasOwnProperty(value)) { 
    // BLAH 
    } 
} 

Đối với phần thứ hai, bạn phải đặt chúng vào chức năng hoặc sử dụng các biến khác nhau. Các giải pháp khác sẽ chỉ sử dụng i thay vì var i lần thứ hai, bởi vì nó đã được xác định ...

4

Nếu bạn xem các tài liệu JSLint, bạn sẽ tìm thấy một liên kết giải thích the rationale behind filtering for-in loops: về cơ bản, đó là tránh vấp ngã trên bất kỳ thuộc tính đếm được nào đã được thêm vào mẫu thử của đối tượng. (Mặc dù bạn không nên sử dụng cho-in để lặp lại trên một mảng anyway.)

Trong trường hợp thứ hai bạn khai báo biến hai lần: biến có phạm vi chức năng (hoặc phạm vi toàn cục) trong JavaScript.Douglas Crockford, và do đó JSLint, lập luận rằng nó là tốt hơn để khai báo biến chỉ một lần cho phạm vi mà nó cư trú:

var i; 

for (i = 0; i < 10; i++) 
{ 
    // foo 
} 

for (i =0; i < 20; i++) 
{ 
    // bar 
} 
0

Tôi đề nghị làm theo JSLint như điểm tham chiếu tốt, bạn có thể muốn cấu hình vài lựa chọn và làm cho bạn kiểm tra looser.

Dù sao cách tốt nhất để lặp qua một mảng là sử dụng cho vòng lặp thay vì cho vòng.

Nếu bạn muốn giải thích chi tiết hãy đọc số này post

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