1. 程式人生 > >迴圈遍歷的幾種方法

迴圈遍歷的幾種方法

1. for迴圈

1) Array陣列

for(let i=0,len=arr.length;i<len;i++){
    console.log(arr[i])
}

2) Object物件

for迴圈無法遍歷Object物件

3) NodeList陣列

<span>1</span>
<span>2</span>
<span>3</span>
for(let i=0,len=span.length;i<len;i++){
    console.log(span[i].innerHTML)
}

4) Set物件

for迴圈無法直接遍歷Set物件,可以先用Array.from()方法或者[...]先將Set物件轉換成普通陣列

let set = new Set(['red', 'green', 'blue']);
var arr=Array.from(set)//或者var arr=[...set]
for(let i=0,len=arr.length;i<len;i++){
    console.log(arr[i])
}

5)  Map

此外,Set物件具有keys(),values(),entries()方法可以分別獲取Set物件的鍵名,鍵值和鍵值對,結合for...of實現遍歷

let map = new Map([
  ['F', 'no'],
  ['T',  'yes'],
]);
var arrr=[...map]
for(let i=0,len=arrr.length;i<len;i++){
    console.log(arrr[i])
}
//["F", "no"]
//["T", "yes"]

6) Generator物件

先利用Array.from或者[...]方法將其轉換為常規陣列

function* gen() {
  yield 1;
  yield 2;
  yield 3;
}
var arr=Array.from(gen())
for(let i=0,len=arr.length;i<len;i++){
    console.log(arr[i])
}

2. forEach

1) Array

arr.forEach((value,key,item)=>{console.log(value)})

2) Object

JavaScript原生的Object物件無法直接使用forEach迴圈遍歷,可以先借用Object物件的方法獲取鍵名陣列

let obj={
    name:'lsh',
    age: 16,
    sex: 'male',
}
Object.getOwnPropertyNames(obj).forEach((key)=>{console.log(obj[key])})
//lsh
//16
//male
或者用Reflect的ownKeys()方法,該方法還能獲取到以Symbol為鍵名的鍵值,而上述原生的JavaScript方法則無法獲取,例如
let email=Symbol();
obj[email]="[email protected]"
Reflect.ownKeys(obj).forEach((key)=>{console.log(obj[key])})
//lsh
//16
//male
//[email protected]

3) NodeList陣列

<span>1</span>
<span>2</span>
<span>3</span>
span.forEach((value,key,item)=>{console.log(item[key].innerHTML)})
//1
//2
//3

4) Set

let set = new Set(['red', 'green', 'blue']);
set.forEach((value,key,item)=>{console.log(value)})
//red
//green
//blue

5) Map物件

const map = new Map([
  ['F', 'no'],
  ['T',  'yes'],
]);
map.forEach((value,key,item)=>{console.log(value)})
//no
//yes

6) Generator物件

先利用Array.from或者[...]方法將其轉換為常規陣列

function* gen() {
  yield 1;
  yield 2;
  yield 3;
}
Array.from(gen()).forEach((value)=>{console.log(value)})

3. for...in 

適用於遍歷普通物件,無法遍歷Map、Set等物件

1) Array

var arr=[1,2,3]
for(let v in arr){
    console.log(v)
}
for(let v in obj){
    console.log(v)
}

2) Object

for(let v in obj){
    console.log(obj[v])
}

3) NodeList物件

for(let v in Array.from(span)){
    console.log(span[v])
}

4) Generator物件

function* gen() {
  yield 1;
  yield 2;
  yield 3;
}
for(let v in Array.from(gen())){
    console.log(v)
}

4. for...of

可以遍歷NodeList、Map、Set、Generator物件

1) Array陣列

let arr=[1,2,3];
for(let v of arr){
    console.log(v)
}
//1
//2
//3

2) 原生的Obejct物件

JavaScript原生的Object物件沒有Iterator 介面,無法使用for...of遍歷器,通過以下方法可以實現用for...of遍歷

let obj={
    name:'lsh',
    age: 16,
    sex: 'male',
}
for(let v of Object.getOwnPropertyNames(obj)){
    console.log(v)
}
或者用Reflect的ownKeys()方法,該方法還能獲取到以Symbol為鍵名的鍵值,而上述原生的JavaScript方法則無法獲取,例如
let email=Symbol();
obj[email]="[email protected]"
for(let v of Reflect.ownKeys(obj)){
    console.log(obj[v])
}
//lsh
//16
//male
//[email protected]

或者用Object.keys()方法和Object.values()方法遍歷,但是該方法無法獲取繼承的屬性和Symbol屬性

let email=Symbol();
obj[email]="[email protected]"
for(let v of Object.keys(obj)){
    console.log(obj[v])
}
for(let v of Object.values(obj)){
    console.log(v);
}
//lsh
//16
//male
//[email protected]

3) NodeList陣列

<span>1</span>
<span>2</span>
<span>3</span>
let span=document.querySelectorAll('span')
for(let v of span){
    console.log(v.innerHTML)
}
//1
//2
//3

4) Set物件

let set = new Set(['red', 'green', 'blue']);
for(let v of set){
    console.log(v)
}
//red
//green
//blue
此外,Set物件具有keys(),values(),entries()方法可以分別獲取Set物件的鍵名,鍵值和鍵值對,結合for...of實現遍歷

5) Map物件

let map = new Map([
  ['F', 'no'],
  ['T',  'yes'],
]);
for(let v of map){
    console.log(v)
}
//["F", "no"]
//["T", "yes"]

此外,Map物件具有keys(),values(),entries()方法可以分別獲取Set物件的鍵名,鍵值和鍵值對,結合for...of實現遍歷

6) Generator物件

只能返回yield的結果,無法返回return的結果

function *foo() {
  yield 1;
  yield 2;
  yield 3;
  return 4;
}

for (let v of foo()) {
  console.log(v);
}
// 1 2 3
想要返回所有結果,需要用到next()方法