2011-12-30 24 views
18

của Java Tôi tự hỏi nếu JavaScript có cú pháp vòng lặp nâng cao cho phép bạn lặp qua mảng. Ví dụ, trong Java, bạn có thể chỉ cần làm như sau:Javascript có cú pháp vòng lặp nâng cao tương tự như

String[] array = "hello there my friend".split(" "); 

for (String s : array){ 
    System.out.println(s); 
} 

đầu ra là:

hello 
there 
my 
friend 

Có cách nào để làm điều này trong JavaScript? Hoặc tôi có phải sử dụng array.length và sử dụng cú pháp vòng lặp chuẩn như dưới đây không?

var array = "hello there my friend".split(" "); 

for (i=0;i<array.length;i++){ 
    document.write(array[i]); 
} 

Trả lời

18

JavaScript có một vòng lặp kiểu foreach (for (x in a)), nhưng nó là vô cùng xấu mã hóa thực hành để sử dụng nó trên một Array. Về cơ bản, cách tiếp cận array.length là chính xác. Cũng có một phương thức a.forEach(fn) trong JavaScripts mới hơn mà bạn có thể sử dụng, nhưng nó không được bảo đảm có mặt trong tất cả các trình duyệt - và nó chậm hơn cách array.length.

CHỈNH SỬA 2017: "Thực vậy, chúng tôi sẽ xem nó như thế nào". Trong hầu hết các công cụ hiện tại, .forEach() hiện nhanh hoặc nhanh hơn for(;;), miễn là chức năng này là nội tuyến, tức là arr.forEach(function() { ... }) là nhanh, foo = function() { ... }; arr.forEach(foo) có thể không hoạt động. Người ta có thể nghĩ rằng hai nên giống hệt nhau, nhưng đầu tiên là dễ dàng hơn cho trình biên dịch để tối ưu hóa hơn so với thứ hai.

+0

Những javascripts mới hơn cùng thực sự điều trị chỉ số mảng như tính hạng nhất, làm cho nó ít của một thực tế xấu. (Nó vẫn còn nguy hiểm nếu bạn đang hỗ trợ động cơ js cũ của khóa học, hoặc nếu Array của bạn thừa kế tài sản và bạn không kiểm tra cho điều đó. Câu trả lời của Rocket dưới đây chứng minh điều này.) – kojiro

+0

Lớp học đầu tiên? Làm sao? –

+0

Vâng, đó là điều - bạn phải hứa sẽ không bao giờ mở rộng một mảng hoặc nguyên mẫu của nó. Ngoài ra, đơn đặt hàng không được bảo đảm. Ngoài ra, ngược lại, nhưng hoàn toàn hợp lý một khi bạn biết những gì đang xảy ra, các chỉ số là biểu diễn chuỗi các số. Ngoài ra, nếu bạn chưa đặt các phần tử, chúng sẽ không được lặp lại. 'a = []; a [3] = 5; cho (i in a) {console.log (i, typeof (i)); } 'chỉ cho' 3 chuỗi', một kết quả khác biệt rõ ràng so với phương thức 'array.length'. – Amadan

2

Có phương thức "forEach" trên nguyên mẫu Array trong các công cụ JavaScript mới hơn. Một số thư viện mở rộng nguyên mẫu với một phương thức tương tự.

+0

Ví dụ: jQuery có '$ .each'. –

+1

@Rocket yes và Prototype thêm ".mỗi "nguyên mẫu Array (hoặc nó được sử dụng để, anyway), và những thứ như Underscore và chức năng cũng làm những việc tương tự. – Pointy

8

Sử dụng phiên bản mới nhất của JavaScript có sẵn cho hầu hết các trình duyệt hiện đại, bạn có thể làm điều này:

array.forEach(function(x){ 
    document.write(x); 
}); 

Cụ thể tại https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/forEach. Nếu bạn lo lắng rằng một trình duyệt có thể không có hỗ trợ cho điều này, bạn có thể tự thêm nó, bằng cách sử dụng phiên bản triển khai (hy vọng được rút ngắn) mà chúng đã liệt kê trong "Khả năng tương thích".

Đây là một chút lỗi thời, nhưng đây là một phiên bản rút gọn tương thích của forEach mà tôi có nguồn gốc từ trang của Mozilla một vài năm trước đây:

if(!Array.prototype.forEach){Array.prototype.forEach=function(b){if(typeof b!="function"){throw new TypeError()}var a=this.length,d=arguments[1],c;for(c=0;c<a;c++){if(c in this){b.call(d,this[c],c,this)}}}}; 

Tôi chưa bao giờ gặp phải bất kỳ vấn đề với điều này, nhưng thực hiện trên trang của Mozilla đã được mở rộng với một số kiểm tra bổ sung và mã để làm cho nó tương thích với ECMA-262, Phiên bản 5, 15.4.4.18.

Tôi có một tệp có tên là common.js mà tôi sử dụng và bao gồm trên tất cả các trang của mình để bao gồm điều này, cũng như tất cả các tính năng bổ sung khác "Array extras" được giới thiệu với JavaScript 1.6, như được liệt kê tại https://developer.mozilla.org/en/JavaScript/New_in_JavaScript/1.6#Array_extras. (Tôi đã có ý nghĩa để cập nhật và xuất bản để sử dụng công khai.)

Đây có thể không phải là cách tiếp cận nhanh nhất (xem http://jsperf.com/for-vs-foreach/15 cho một số chi tiết cụ thể - cảm ơn liên kết, Amadan) - nhưng có điều gì đó để nói cho sự đồng nhất và bảo trì, vv Ngoài ra, nó sẽ rất thú vị để xem có bao nhiêu sự chênh lệch này được tối ưu hóa bằng cách cải tiến thêm các công cụ JavaScript trong vài tháng và vài năm tới. :-)

3

Bạn có thể làm for(s in array), nhưng hãy cẩn thận, nó không giống như foreach.

Trong trường hợp này s là khóa (chỉ mục), không phải là giá trị. Bạn cũng cần phải sử dụng hasOwnPropertyin vòng mặc dù đối tượng cũng là prototype.

for(s in array){ 
    if(array.hasOwnProperty(s)){ 
     console.log(array[s]); 
    } 
} 

EDIT: Như @Amadan chỉ ra, hasOwnPropertykhông tính lặp khi họ đang bổ sung như sau: array.test = function(){}. Tôi đề xuất không phải sử dụng for...in.

EDIT2: Nếu bạn đang sử dụng trình duyệt web hiện đại (mọi thứ không phải là IE < 9), bạn có thể sử dụng Array.forEach). @ziesemer chỉ ra rằng Mozilla has a shim cho điều này nếu bạn cần hỗ trợ IE < 9.

array.forEach(function(s){ 
    console.log(s); 
}); 

Chú ý: Cá nhân tôi sử dụng cho các dự án jQuery JavaScript của tôi, và tôi sử dụng $.each.

$.each(array, function(i,s){ 
    console.log(s); 
}); 
+0

Tại sao không chỉ sử dụng' forEach'? (Xem Amadan hoặc câu trả lời của tôi.) Ngay cả cách tiếp cận này có thể phá vỡ nếu mọi thứ – ziesemer

+0

Không phải tất cả các trình duyệt (tôi nghĩ tất cả trừ IE) đều hỗ trợ 'Array.prototype.forEach'. –

+0

Chỉ số mảng là lớp đầu tiên các thuộc tính của mảng là một tính năng tương đối mới cho Javascript, có phải là chúng không? Bạn có biết phiên bản này đã được giới thiệu ở đâu? – kojiro

1
x = [1,2,3]; 
for (i in x) { 
    console.log(i); 
} 
+3

Xin đừng làm điều này. – ziesemer

+0

Điều này sẽ không hoạt động như mong đợi. Trong một vòng lặp 'for ... in',' i' là khóa (chỉ mục), không phải là giá trị. Bạn cần 'console.log (x [i])'. Bạn cũng nên kiểm tra 'if (x.hasOwnProperty (x))' để đảm bảo rằng bạn không lặp qua các thuộc tính trong 'prototype'. –

2

Trong ES2015 (ES6), bạn có thể sử dụng for-of vòng lặp. Nó được hỗ trợ trong hầu hết các trình duyệt với ngoại lệ của IE.

let array = [10, 20, 30]; 

for (let value of array) { 
    console.log(value); 
} 

See the Mozilla explanation here

1

Hãy thử điều này,

var errorList = new Array(); 
     errorList.push("e1"); 
     errorList.push("e2"); 

     for (var indx in errorList){ 
       alert(errorList[indx]); 
      } 
Các vấn đề liên quan