2008-10-03 17 views

Trả lời

9
for(var i = 0, iLen = myArray.length; i < iLen; i++) 

Xem http://blogs.oracle.com/greimer/resource/loop-test.html cho các tiêu chuẩn khác nhau loop construc Javascript ts.

+0

Sự khác biệt giữa hai cách tiếp cận là không thể bỏ qua cho một mảng. Nó chỉ trở nên quan trọng khi giao dịch với DOM. – AnthonyWJones

2

Nếu myArray là mảng javascript thì nó không quan trọng đủ để bạn lo lắng về nó, nó chỉ là một tài sản nhìn lên trên một đối tượng nhưng sau đó là sử dụng biến.

Nếu chiều dài OTH là thuộc tính được hiển thị bởi đối tượng bộ sưu tập được cung cấp bởi trình duyệt DOM (đặc biệt là IE) thì có thể tốn kém đáng ngạc nhiên. Do đó khi liệt kê một bộ sưu tập DOM được cung cấp mà tôi có xu hướng sử dụng: -

for (var i = 0, length = col.length; i < length; i++) 

nhưng đối với mảng tôi không bận tâm với điều đó.

+0

truy cập vào biến cục bộ không phải là quyền truy cập thuộc tính - đây là tra cứu trực tiếp nhanh hơn nhiều, với mức độ trực tiếp khác nhau tùy thuộc vào việc triển khai. Không thực hiện chính (trừ IE tất nhiên * thở dài *) thực hiện tra cứu tài sản thực tế nữa. – olliej

1

No. Không tính toán lại cuộc gọi. Nó tính toán lại theo yêu cầu trong lớp Array.

Nó sẽ thay đổi khi bạn sử dụng đẩy, pop, thay đổi, unshift, concat, nối vv Nếu không, nó chỉ là một Số - cùng một ví dụ mỗi lần bạn gọi cho giá trị của nó.

Nhưng, miễn là bạn không ghi đè rõ ràng (array.length = 0), nó sẽ chính xác với mỗi cuộc gọi.

0

Trong khi hình thức thứ hai có thể nhanh hơn:

function p(f) { var d1=new Date(); for(var i=0;i<20;i++) f(); print(new Date()-d1) } 
p(function(){for(var i=0;i<1000000; i++) ;}) 
p(function(){var a = new Array(1000000); for(var i=0;i<a.length; i++) ;}) 
> 823 
> 1283 

..it nên không thực sự quan trọng trong bất kỳ trường hợp phi cạnh.

1

Thuộc tính độ dài không được tính trên mỗi cuộc gọi, nhưng phiên bản thứ hai sẽ nhanh hơn khi bạn đang lưu vào bộ nhớ cache tra cứu thuộc tính. Ngay cả với hầu hết các phiên bản JS hiện hành (V8, TraceMonkey, SquirrelFish Extreme) sử dụng nâng cao (ví dụ: SmallTalk age;)) thuộc tính caching tra cứu tài sản vẫn là ít nhất một nhánh có điều kiện nhiều hơn phiên bản thứ hai của bạn.

Mảng.length không liên tục vì các mảng JS có thể thay đổi được, vì vậy, push, pop, array[array.length]=0, etc có thể thay đổi tất cả.

Có các khái niệm khác như DOM NodeList mà bạn nhận được từ các cuộc gọi như document.getElementsBySelector được dự kiến ​​sẽ hoạt động trong trường hợp này độ dài có thể được tính toán lại khi bạn lặp lại. Nhưng sau đó nếu chiều dài không nhận được recomputed có một cơ hội tốt mà nó cũng sẽ có thực sự thay đổi, do đó, bộ nhớ đệm bằng tay đầu ra có thể không hợp lệ.

0

Theo ECMAScript specification, nó chỉ nói cách là "chiều dài" bất động sản phải được tính toán, nhưng nó không nói khi. Tôi nghĩ rằng nó có thể được thực hiện phụ thuộc.

Nếu tôi thực hiện nó, tôi sẽ làm như Jonathan chỉ ra, nhưng trong trường hợp thuộc tính "chiều dài" từ các đối tượng mảng.

0

Nếu bạn đã từng có ý kiến ​​cho rằng nó có thể thay đổi trong vòng lặp thì tất nhiên nó phải được kiểm tra cho mỗi vòng lặp ...

- nếu không nó rõ ràng là quả hạch hỏi một đối tượng nhiều lần, vì nó sẽ được nếu bạn đặt nó trong thẩm định tài sản của if-tuyên bố ...

if(i=0, iMax=object.length; iMax>i; i++) 

- chỉ trong trường hợp đặc biệt, bạn nên nghĩ đến việc làm bằng cách khác -!)

2

tôi nghĩ rằng câu trả lời cho ý định của câu hỏi của bạn là, có, thuộc tính array.length được tính toán lại mỗi eration thông qua vòng lặp nếu bạn sửa đổi mảng trong vòng lặp. Ví dụ, đoạn mã sau:

var arr = [1,2,3]; 
for(var i = 0; i < arr.length; i++){ 
    console.debug("i = " + i); 
    console.debug("indexed value = " + arr[i]) 
    arr.pop(); 
} 

chí đầu ra:

i = 0 
indexed value = 1 
i = 1 
indexed value = 2 

trong khi mã này:

var arr = [1,2,3]; 
var l = arr.length; 
for(var i = 0; i < l; i++){ 
    console.debug("i = " + i); 
    console.debug("indexed value = " + arr[i]) 
    arr.pop(); 
} 

chí đầu ra:

i = 0 
indexed value = 1 
i = 1 
indexed value = 2 
i = 2 
indexed value = undefined 

-J

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