FOR循环

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

  1. let arr = [10, 20, 30];
  2. for (let i = 0; i < arr.length; i++) {
  3. // ...
  4. }

for in 循环

for in 循环

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

    • 1.Symbol类型的私有属性没有被迭代到
    • 2.数字属性会被优先迭代[而且是按照 小->大] 这个bug是解决不了的
    • 3.不论是对象的私有还是公有属性,只要是可枚举的,都会被迭代到 [“不严谨”的来说,一般内置的属性都是不可枚举的,而自定义的属性都是可枚举的]

+…

  • 可以迭代当前对象中所有可枚举【列举】的属性
  • 性能差 是因为无论是公有还是私有 都会被迭代
  1. let obj={
  2. name:'zhufeng',
  3. age:18,
  4. 0:100,
  5. [Symbol('AA')]:200
  6. };
  7. 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]);
});

for while

for和while链接