FOR循环
FOR循环:本质是自己控制循环多少次,所以只有清楚的知道自己内部有多少个成员的数据结构(例如:数组/类数组)才会基于FOR循环处理
let arr = [10, 20, 30];
for (let i = 0; i < arr.length; i++) {
// ...
}
for in 循环
for in 循环
- 是JS所有循环中,性能最差的一个
也是Bug最多的一个
- 1.Symbol类型的私有属性没有被迭代到
- 2.数字属性会被优先迭代[而且是按照 小->大] 这个bug是解决不了的
- 3.不论是对象的私有还是公有属性,只要是可枚举的,都会被迭代到 [“不严谨”的来说,一般内置的属性都是不可枚举的,而自定义的属性都是可枚举的]
+…
- 可以迭代当前对象中所有可枚举【列举】的属性
- 性能差 是因为无论是公有还是私有 都会被迭代
let obj={
name:'zhufeng',
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]);
});