1

图片描述

如上图所示,本文主要阐述了Array的四种迭代器 for,for-of,for-in 和 for-each的功能和区别

for

  • 动态数组:每次遍历开始时都会重新计算一次数组的长度
  • 稀疏数组:不会跳过无效数组

for-of

  • 动态数组:与for一样,会遍历到新增加的元素
  • 稀疏数组:也不会跳过无效数组
  • 特点:
    1、可以遍历字符串
    2、可以遍历类数组对象:DOM;NodeList对象
    3、可以遍历数组中的值
    4、可以遍历set,map对象

注释:
set
定义:用来不重复的存储任何数据类型的对象,不管是基本的数据类型还是对象
使用 new Set(array)
map:
定义:用来存储键值对象的数据
使用: new Map([iterable])参数是一个数组或者是由键值对组成的可遍历对象


测试

    /**可以遍历字符串 */
    const strTarget = 'hello';
    for(item of strTarget){
        console.log(item);
    }

结果:图片描述

 /**遍历DOM元素*/
    const pdom = document.getElementsByTagName('p');
    for( item of pdom){
        console.log(item);
    }

结果:图片描述

    /**遍历数组中的值 */
    const arr = ['liumin','qijun','fengjian','lala'];
    for(item of arr){
       console.log(item); 
    }

结果:图片描述

    /**遍历set和map中的值 */
    const setObj = new Set([1,2,2,3,5,6]);
    for(value of setObj){
        console.log(value);
    }

    const mapObj = new Map([['a',1],['b',2]]);
    for([key, value] of mapObj){
        console.log(`${key}----${value}`);
    }

遍历set的输出值:
图片描述
遍历map的输出值:
图片描述

forEach

  • 动态数组:不会遍历到新增加的元素
  • 稀疏数组:会跳过无效数组
  • 特点:不能用break和return来中断循环

for-in

  • 动态数组:不会遍历到新增加的元素
  • 稀疏数组:会跳过无效数组
  • 特点:
    1、for-in是为对象的遍历而设计的,index不是实际数字,而是键字符串,与Object.keys()方法类似
    2、给数组额外定义一个属性,会遍历到这个属性和值
    3、遍历顺序有时也是随机的
    4、数组原型链上的属性也会被访问到

额外定义属性

给数组额外定义一个属性,for-in会遍历到这个属性值,forEach,for-of,for都不会遍历到这个属性值

测试

  const anotherArr = ['huang', 'lala', 'baba'];
  const array = ['iumin', 'huahua', 'jianjian'];
  array.another = anotherArr;

  console.log('----for-in----');
  for(let index in array){
      console.log(`${index}---${array[index]}`);
  }

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

  console.log('----forEach----');
  array.forEach((value) => {
    console.log(value);
  })

  console.log('----for-----');
  const arLenght = array.length;
  for(let i=0 ; i<arLenght; i++){
      console.log(array[i]);
  }

图片描述
由图可以看出除了for-in其他三个都不会遍历到数组额外定义的属性

稀疏数组

for-in和forEach会跳过无效数组
测试

    const arr = [];
    arr[0] = 0;
    arr[100] = 100;
    arr[1000] = 1000;
 
    for(info in arr){
        console.log("arr["+info+"] = "+arr[info]);
    }
    
    arr.forEach((value) => {
        console.log(value);
    })  

图片描述
由结果可以看出,for-in 和 foreach 只能输出赋过值的元素,没有赋过值的元素将不会输出来
for 和 for-of是不会跳过无效数组的

    const arr = [];
    arr[0] = 0;
    arr[100] = 100;
    arr[1000] = 1000;
 
 for(let info of arr){
    console.log(info);
 }
 
 for(let i=0; i<arr.length; i++){
     console.log(arr[i]);
 }  

这两个的输出结果是一样的:
图片描述
可以看出把没有赋值的元素也输出出来了

动态数组

for-of 和 for 可以遍历到新增加的元素
测试(以for-of为例):

    const arr = ['liumin','huahua','jianjian'];

    for(item of arr){
        if(item === 'jianjian'){
            arr.push('hello');
        }     
        console.log(item);
    }

输出结果:
图片描述
for的输出结果与上述一致

for-in 和 forEach 不可以遍历到新增加的元素
测试(以 for-in为例):

    const arr = ['liumin','huahua','jianjian'];

    for(item in arr){
        if(item === 2){
            arr.push('hello');
        }     
        console.log(arr[item]);
    }

输出结果:
图片描述


maxmin
226 声望6 粉丝