js中常见的循环遍历

151 阅读3分钟

“我报名参加金石计划1期挑战——瓜分10万奖池,这是我的第13篇文章,点击查看活动详情

一、js中遍历的几种方法

for循环

1、【应用环境】

FOR循环:本质是自己控制循环多少次,所以只有清楚的知道自己内部有多少个成员的数据结构(例如:数组/类数组)才会基于FOR循环处理

2、【基础语法】

1、 想要依次打印出下面的语法

var ary=[1,2,3];
for (var i=0;i<ary.length;i++){
     console.log(ary[i]);
}
  • 定义初始值
  • 制定循环条件,只要条件成立就会执行循环体中的内容
  • 循环体(大括号就是循环体)
  • 定义的初始值累计操作
for (定义初始值;制定循环条件;定义的初始值累计操作){循环体}

2、把下面的数组从后到前依次打印出来

var ary=[1,2,3,4];
for(var i=ary.length-1; i>=0;i--){
    console.log(ary[i]);
}

3、打印所有的奇数项

var ary=[1,2,3,4];
for(var i=0;i<ary.length;i++){
       //i=0   第一项 
       //i=1   第二项
       //i=3   第三项
       // 打印所有的奇数项,其实就是打印多有索引为偶数的项
       //i%2==0 的时候就是偶数项
       if(i%2==0){
           console.log(ary[i]);
       }
}

3、【两个重要的关键词】

  • continue:  结束本次循环,继续下一轮循环
  • break:       强制结束整个循环

3.1【案例解说具体含义】

for(var i=0;i<10;i++){
       if(i<5){
          i++;//
          continue;
       }
       if(i>7){
          i+=2;
          break;
       }
       i+=1;
}
console.log(i);
// 最终答案是10

3.2【练习题】

下面的案例,最终打印的是几?打印几次

5 一次

for(var i=1;i<=10;i+=2){
       if(i<=5){
          i++;//
          continue;
       }else{
          i-=2;
          break;
       }
       i--;
       console.log(i);       
}
console.log(i);

While循环

1、【应用环境】

只要条件成立,就一直执行,知道条件不成立的时候停止

使用while 循环的时候,一定要避免死循环

知道循环的次数 我们一般使用for循环 不知道具体多少次的 一般使用while

2、【基础语法】

while(条件){
  循环体
}
let arr = [10, 20, 30];
for (let i = 0; i < arr.length; i++) {
    // ...
} 

do...while循环

与while相似,但是他会先执行一次,再做判断条件

var i=0

do{

console,log(i)

i++

}while(i<10)

for of循环

1、【应用环境】

for...of语句在[可迭代对象]((包括 [Array]、[Map]、[Set]、[String]、[TypedArray]、[arguments] 对象等等)

2、【基础语法】

for (variable of iterable) {
    //statements
}
  • variable

    在每次迭代中,将不同属性的值分配给变量。

  • iterable

    被迭代枚举其属性的对象。

3、[与for...in的区别]

无论是for...in还是for...of语句都是迭代一些东西。它们之间的主要区别在于它们的迭代方式。

[for...in]语句以任意顺序迭代对象的[可枚举属性]

for...of 语句遍历[可迭代对象]定义要迭代的数据

3.1【案例解说具体含义】

const array = ['a', 'b', 'c'];

for (const element of array) {
  console.log(element);
}
//输出a b c

forEach循环

1、【应用环境】

forEach() 方法用于调用数组的每个元素,并将元素传递给回调函数。

注意:  forEach() 对于空数组是不会执行回调函数的。

2、【基础语法】

array.forEach(function(currentValue, index, arr), thisValue)

3、【参数】

参数描述
function(currentValue, index, arr)必需。 数组中每个元素需要调用的函数。 函数参数:参数描述
currentValue必需。当前元素
index可选。当前元素的索引值。
arr可选。当前元素所属的数组对象。
thisValue可选。传递给函数的值一般用 "this" 值。 如果这个参数为空, "undefined" 会传递给 "this" 值

3.1【案例解说具体含义】

var arr = [0,1,2,3]
arr.forEach((item,index)=>{
    console.log(`下标${index}的数为${item}`)
})

二、js 遍历对象的几种方法

for in 循环

作用: 一般用来遍历对象的属性,遍历数组的话拿到的是下标

  • 是JS所有循环中,性能最差的一个

  • 也是Bug最多的一个

    • 1.Symbol类型的私有属性没有被迭代到

    • 2.数字属性会被优先迭代[而且是按照 小->大]  这个bug是解决不了的

    • 3.不论是对象的私有还是公有属性,只要是可枚举的,都会被迭代到 [“不严谨”的来说,一般内置的属性都是不可枚举的,而自定义的属性都是可枚举的]

    • ...
  • 可以迭代当前对象中所有可枚举【列举】的属性

  • 性能差 是因为无论是公有还是私有 都会被迭代

let obj={
    name:'dongfangmiaomiao',
    age:18,
    0:100,
    [Symbol('AA')]:200
};

Object.prototype.aaa='AAA';

解决第三个问题

如果迭代了公有的可枚举的属性,我们直接结束循环即可,在真实场景中,一般需要迭代的都是私有属性  

//for in 
 for(let key in obj){
     //key:依次迭代的属性
     //obj[key]:依次迭代的属性值
     //obj.hasOwnProperty验证是否私有的 私有的返回true  公有的是false
    if(!obj.hasOwnProperty(key)) break;// 解决第三个问题,如果迭代了公有的可枚举的属性,我们直接结束循环即可,在真实场景中,一般需要迭代的都是私有属性  
    console.log(key,obj[key]);
 }

不用for in 遍历对象的属性名和属性值

// Object.keys(obj) : 获取obj中所有“非Symbol类型”的“私有”属性「前提:可枚举的」 结果:包含属性名的数组
// Object.getOwnPropertySymbols(obj) : 获取obj中所有symbol类型的私有属性
// --> 拼接到一起:包含obj中所有“可枚举”的“私有属性”的一个数组集合
let keys = Object.keys(obj).concat(Object.getOwnPropertySymbols(obj));
keys.forEach(key => {
    // key:获取的某个属性
    // obj[key]:获取的某个属性值
    console.log(key, obj[key]);
}); 

Object.keys(obj)/Object.values(obj)

[参数]

obj:要返回其枚举自身属性的对象

[返回值]

一个表示给定对象的所有可枚举属性的字符串数组。


const obj = {
    id:1,
    name:'dongfangmiaomiao',
    age:18
}

 console.log(Object.keys(obj))

console.log(Object.values(obj))


输出结果: obj对象的key组成的数组

['id','name','age']

 

输出结果:obj对象的value组成的数组

['1','dongfangmiaomiao','18']

Object.getOwnPropertyNames(obj)

[参数]

obj:一个对象,其自身的可枚举和不可枚举属性的名称被返回

[返回值]

返回一个数组,包含对象自身的所有属性(包含不可枚举属性)

遍历可以获取key和value

const obj = {
            id:1,
            name:'dongfangmiaomiao',
            age:18
    }
    Object.getOwnPropertyNames(obj).forEach(function(key){
        console.log(key+ '---'+obj[key])
    })

输出结果:

['1','dongfangmiaomiao','18']