Hướng dẫn how do i traverse a list in javascript? - làm cách nào để duyệt qua danh sách trong javascript?

Có, giả sử triển khai của bạn bao gồm tính năng ____ 10 ...________ 11 được giới thiệu trong Ecmascript 2015 (bản phát hành "Harmony") ... đây là một giả định khá an toàn trong những ngày này.

Nó hoạt động như thế này:

// REQUIRES ECMASCRIPT 2015+
var s, myStringArray = ["Hello", "World"];
for (s of myStringArray) {
  // ... do something with s ...
}

Hoặc tốt hơn nữa, vì ECMAScript 2015 cũng cung cấp các biến số khối:

// REQUIRES ECMASCRIPT 2015+
const myStringArray = ["Hello", "World"];
for (const s of myStringArray) {
  // ... do something with s ...
}
// s is no longer defined here

(Biến

// REQUIRES ECMASCRIPT 2015+
const myStringArray = ["Hello", "World"];
for (const s of myStringArray) {
  // ... do something with s ...
}
// s is no longer defined here
2 khác nhau trên mỗi lần lặp, nhưng vẫn có thể được khai báo
// REQUIRES ECMASCRIPT 2015+
const myStringArray = ["Hello", "World"];
for (const s of myStringArray) {
  // ... do something with s ...
}
// s is no longer defined here
3 bên trong thân vòng miễn là nó không được sửa đổi ở đó.)

Một ghi chú trên các mảng thưa thớt: một mảng trong JavaScript có thể không thực sự lưu trữ nhiều mục như được báo cáo bởi

// REQUIRES ECMASCRIPT 2015+
const myStringArray = ["Hello", "World"];
for (const s of myStringArray) {
  // ... do something with s ...
}
// s is no longer defined here
4 của nó; Số đó chỉ đơn giản là một chỉ số lớn hơn chỉ số cao nhất mà tại đó giá trị được lưu trữ. Nếu mảng giữ ít phần tử hơn được chỉ ra bởi chiều dài của nó, thì nó được cho là thưa thớt. Ví dụ, hoàn toàn hợp pháp khi có một mảng chỉ có các mục tại các chỉ mục 3, 12 và 247;
// REQUIRES ECMASCRIPT 2015+
const myStringArray = ["Hello", "World"];
for (const s of myStringArray) {
  // ... do something with s ...
}
// s is no longer defined here
4 của một mảng như vậy là 248, mặc dù nó chỉ thực sự lưu trữ 3 giá trị. Nếu bạn cố gắng truy cập một mục ở bất kỳ chỉ mục nào khác, mảng sẽ có giá trị
// REQUIRES ECMASCRIPT 2015+
const myStringArray = ["Hello", "World"];
for (const s of myStringArray) {
  // ... do something with s ...
}
// s is no longer defined here
6 ở đó, nhưng mảng dù sao cũng khác với giá trị thực sự có giá trị
// REQUIRES ECMASCRIPT 2015+
const myStringArray = ["Hello", "World"];
for (const s of myStringArray) {
  // ... do something with s ...
}
// s is no longer defined here
6 được lưu trữ. Bạn có thể thấy sự khác biệt này theo một số cách, ví dụ theo cách nút REPLAYS Hiển thị mảng:

> a
[ <12 empty items>, 1 ]
> a[0]
undefined
> a[0]=undefined
undefined
> a
[ undefined, <11 empty items>, 1 ]

Vì vậy, khi bạn muốn "lặp qua" một mảng, bạn có một câu hỏi để trả lời: Bạn có muốn lặp qua toàn bộ phạm vi được chỉ ra bởi độ dài và xử lý của nó hiện nay? Có rất nhiều ứng dụng cho cả hai phương pháp; Nó chỉ phụ thuộc vào những gì bạn đang sử dụng mảng cho.

Nếu bạn lặp lại trên một mảng với ________ 10 ..________ 11, phần thân của vòng lặp được thực thi

// REQUIRES ECMASCRIPT 2015+
const myStringArray = ["Hello", "World"];
for (const s of myStringArray) {
  // ... do something with s ...
}
// s is no longer defined here
4 lần và biến điều khiển vòng lặp được đặt thành
// REQUIRES ECMASCRIPT 2015+
const myStringArray = ["Hello", "World"];
for (const s of myStringArray) {
  // ... do something with s ...
}
// s is no longer defined here
6 cho bất kỳ mục nào không thực sự có trong mảng. Tùy thuộc vào các chi tiết của mã "làm một cái gì đó với" của bạn, hành vi đó có thể là những gì bạn muốn, nhưng nếu không, bạn nên sử dụng một cách tiếp cận khác.

Tất nhiên, một số nhà phát triển không có lựa chọn nào khác ngoài việc sử dụng một cách tiếp cận khác, bởi vì vì bất kỳ lý do gì, họ đang nhắm mục tiêu một phiên bản JavaScript chưa hỗ trợ ____ 10 ...________ 11.

Miễn là việc triển khai JavaScript của bạn tuân thủ phiên bản trước của đặc tả ECMAscript (ví dụ, quy định, các phiên bản của Internet Explorer trước 9), thì bạn có thể sử dụng phương thức ingerator

> a
[ <12 empty items>, 1 ]
> a[0]
undefined
> a[0]=undefined
undefined
> a
[ undefined, <11 empty items>, 1 ]
5 thay vì vòng lặp. Trong trường hợp đó, bạn vượt qua một chức năng được gọi trên mỗi mục trong mảng:

var myStringArray = [ "Hello", "World" ];
myStringArray.forEach( function(s) { 
     // ... do something with s ...
} );

Tất nhiên bạn có thể sử dụng chức năng mũi tên nếu triển khai của bạn hỗ trợ ES6+:

myStringArray.forEach( s => { 
     // ... do something with s ...
} );

Không giống như ________ 10 ...________ 11,

> a
[ <12 empty items>, 1 ]
> a[0]
undefined
> a[0]=undefined
undefined
> a
[ undefined, <11 empty items>, 1 ]
8 chỉ gọi hàm cho các phần tử thực sự có trong mảng. Nếu thông qua mảng giả thuyết của chúng tôi với ba yếu tố và chiều dài là 248, nó sẽ chỉ gọi hàm ba lần chứ không phải 248 lần. Nếu đây là cách bạn muốn xử lý các mảng thưa thớt,
> a
[ <12 empty items>, 1 ]
> a[0]
undefined
> a[0]=undefined
undefined
> a
[ undefined, <11 empty items>, 1 ]
8 có thể là cách để đi ngay cả khi thông dịch viên của bạn hỗ trợ ________ 10 ...________ 11.

Tùy chọn cuối cùng, hoạt động trong tất cả các phiên bản của JavaScript, là một vòng đếm rõ ràng. Bạn chỉ cần đếm từ 0 đến một đến một so với chiều dài và sử dụng bộ đếm làm chỉ mục. Vòng lặp cơ bản trông như thế này:

var i, s, myStringArray = [ "Hello", "World" ], len = myStringArray.length;
for (i=0; i

Một lợi thế của phương pháp này là bạn có thể chọn cách xử lý các mảng thưa thớt. Mã trên sẽ chạy phần thân của vòng lặp toàn bộ

// REQUIRES ECMASCRIPT 2015+
const myStringArray = ["Hello", "World"];
for (const s of myStringArray) {
  // ... do something with s ...
}
// s is no longer defined here
4 lần, với
// REQUIRES ECMASCRIPT 2015+
const myStringArray = ["Hello", "World"];
for (const s of myStringArray) {
  // ... do something with s ...
}
// s is no longer defined here
2 được đặt thành
// REQUIRES ECMASCRIPT 2015+
const myStringArray = ["Hello", "World"];
for (const s of myStringArray) {
  // ... do something with s ...
}
// s is no longer defined here
6 cho bất kỳ phần tử bị thiếu nào, giống như ________ 10 ..________ 11; Thay vào đó, nếu bạn chỉ muốn xử lý các phần tử hiện tại thực sự của một mảng thưa thớt, như
> a
[ <12 empty items>, 1 ]
> a[0]
undefined
> a[0]=undefined
undefined
> a
[ undefined, <11 empty items>, 1 ]
8, bạn có thể thêm một bài kiểm tra
var myStringArray = [ "Hello", "World" ];
myStringArray.forEach( function(s) { 
     // ... do something with s ...
} );
8 đơn giản trên chỉ mục:

var i, s, myStringArray = [ "Hello", "World" ], len = myStringArray.length;
for (i=0; i

Tùy thuộc vào tối ưu hóa của bạn, việc gán giá trị độ dài cho biến cục bộ (trái ngược với việc bao gồm biểu thức

var myStringArray = [ "Hello", "World" ];
myStringArray.forEach( function(s) { 
     // ... do something with s ...
} );
9 đầy đủ trong điều kiện vòng lặp) có thể tạo ra sự khác biệt đáng kể về hiệu suất vì nó bỏ qua một lần tra cứu thuộc tính mỗi lần. Bạn có thể thấy bộ nhớ đệm độ dài được thực hiện trong mệnh đề khởi tạo vòng lặp, như thế này:

var i, len, myStringArray = [ "Hello", "World" ];
for (len = myStringArray.length, i=0; i

Vòng lặp đếm rõ ràng cũng có nghĩa là bạn có quyền truy cập vào chỉ mục của từng giá trị, nếu bạn muốn nó. Chỉ mục cũng được truyền dưới dạng một tham số bổ sung cho chức năng bạn chuyển sang

myStringArray.forEach( s => { 
     // ... do something with s ...
} );
0, do đó bạn cũng có thể truy cập nó theo cách đó:

myStringArray.forEach( (s,i) => {
   // ... do something with s and i ...
});

________ 10 ...________ 11 không cung cấp cho bạn chỉ mục được liên kết với mỗi đối tượng, nhưng miễn là đối tượng bạn lặp lại thực sự là một ví dụ của

myStringArray.forEach( s => { 
     // ... do something with s ...
} );
3 (và không phải là một trong những loại khác ____ 10 ..________ 11 hoạt động trên) , bạn có thể sử dụng phương thức mục nhập Array#để thay đổi nó thành một mảng [chỉ mục, mục], và sau đó lặp lại điều đó:

for (const [i, s] of myStringArray.entries()) {
  // ... do something with s and i ...
}

Cú pháp ____ 10 ...________ 38 được đề cập bởi những người khác là để lặp lại các thuộc tính của một đối tượng; Vì một mảng trong JavaScript chỉ là một đối tượng có tên thuộc tính số (và thuộc tính

// REQUIRES ECMASCRIPT 2015+
const myStringArray = ["Hello", "World"];
for (const s of myStringArray) {
  // ... do something with s ...
}
// s is no longer defined here
4 được cập nhật tự động), bạn có thể lặp về mặt lý thuyết trên một mảng với nó. Nhưng vấn đề là nó không tự giới hạn các giá trị thuộc tính số (hãy nhớ rằng ngay cả các phương thức thực sự chỉ là các thuộc tính có giá trị là đóng cửa), cũng không được đảm bảo để lặp lại so với các phương thức theo thứ tự số. Do đó, không nên sử dụng cú pháp ____ 10 ...________ 38 để lặp qua các mảng.

Bạn có thể lặp lại một chuỗi trong JavaScript không?

Chuỗi JavaScript @@ iterator phương thức [@@ iterator] () trả về đối tượng iterator được lặp lại trên tất cả các điểm mã của chuỗi.Chuỗi [@@ iterator] được xây dựng - trong thuộc tính của chuỗi.Chúng ta có thể sử dụng phương pháp này bằng cách tạo một trình lặp chuỗi.Chúng ta có thể tạo một trình lặp bằng cách gọi thuộc tính @@ iterator của chuỗi.[@@iterator]() returns iterator object which iterate over all code point of String. String[@@iterator] is Built – in Property of String. We can use this method by making a string iterator. We can make an iterator by calling the @@iterator property of String.

Lặp lại mảng trong JavaScript là gì?

Phương pháp @@ iterator của một đối tượng mảng thực hiện giao thức có thể lặp lại và cho phép các mảng được tiêu thụ bởi hầu hết các cú pháp mong đợi Iterables, chẳng hạn như cú pháp lan truyền và cho ... các vòng lặp.Nó trả về một trình lặp lại mang lại giá trị của mỗi chỉ mục trong mảng.. It returns an iterator that yields the value of each index in the array.