for循环、for-in、forEach、for-of四大循环
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
for循环、for-in、forEach、for-of四⼤循环
平时⾃⼰在写⼀些⼩栗⼦的时候,⽤到的基本上是for循环,因为在学专业课(C,C++,JAVA,...)的时候⽤的最多的就是for循环,不过for循环的效率也是⽐较⾼的。
但是for循环在写的时候,涉及到length,index这⼏个变量,使⽤起来个⼈觉得还是有点复杂。
for-in循环
最近⾃⼰在复习⾼程的时候,也看了看for-in循环,这个循环是特别针对遍历对象属性的。
ECMAScript对象的属性没有顺序,因此通过for-in循环输出的属性名的顺序是不可预测的,所有属性都会被返回⼀次,但是返回的顺序因浏览器不同。
之前如果要迭代的对象的变量值为null或undefined,for-in语句会抛出错误。
但是ECMAScript5更正了这⼀⾏为:对这种情况不再抛出错误,⽽只是不执⾏循环体。
为了保证最⼤限度的兼容,建议使⽤for-in循环之前,先检测确认该对象的值不是null或undefined。
Array的真相
在JavaScript中,所有的东西可可以看作是⼀个对象,Array也是⼀个对象,Array的索引就是属性名。
实际上,Array的索引也不是Number 类型,⽽是String类型的。
每个Array也有⼀个length属性,导致看起来像是⼀个数组。
但是length这个属性是不可枚举的,所以在使⽤for-in循环遍历Array时,没有length。
即使不在Array中添加新的属性,也不会只输出数组中的内容。
Array.prototype.father = "xiaoming";
const arr = [1,2,3];
= "hello world";
let index;
for(index in arr){
console.log("array["+index+"]:"+arr[index]);
}
// array[0]:1
// array[1]:2
// array[2]:3
// array[name]:hello world
// array[father]:xiaoming
for-in循环的每次迭代操作会同时搜索实例或者原型属性,for-in循环的每次迭代会产⽣很多开销。
除⾮明确要迭代⼀个属性数量未知的对象,否则应该避免使⽤for-in循环
forEach循环
forEach循环是js⾼程上数组的⼀个⽅法,还有⼏个⽅法参看
const arr = [];
arr[0] = "a";
arr[3] = "b";
arr[10] = "c";
= "Hello world";
arr.forEach((data, index, array) => {
console.log(data, index, array); //这⾥的index是Number类型,这⾥并没有遍历到name属性
});
// a 0 (11) ["a", empty × 2, "b", empty × 6, "c", name: "Hello world"]
// b 3 (11) ["a", empty × 2, "b", empty × 6, "c", name: "Hello world"]
// c 10 (11) ["a", empty × 2, "b", empty × 6, "c", name: "Hello world"]
forEach循环不会遍历原型链上的属性
for-of循环
这个是ES6新增的⼀个⽅法,⽤于解决for-in⽤来遍历数组出现的问题。
为什么要引进for-of循环呢?
forEach不能break和return
for-in缺点更加明显,不仅会遍历数组中的元素,还会遍历⾃定义的属性,甚⾄把原型链上的属性都被访问到。
⽽且遍历数组元素的顺序可能是随机的。
for-of循环可以⼲什么呢?
跟forEach相⽐,可以正确响应break,continue,return
for-of循环不仅⽀持数组,还⽀持⼤多数类数组对象,例如DOM nodelist对象
for-of循环也⽀持字符串遍历,将字符串视为⼀系列的Unicode字符来进⾏遍历
for-of也⽀持Map和Set(两者均为ES6中新增的类型)遍历。
这是最直接、最简洁的遍历数组的⽅法
这个⽅法避开了for-in循环的所有缺陷
与forEach不同的是,可以使⽤break,continue,return语句
不仅可以遍历数组,还可以遍历类数组对象和其他可迭代对象。
但是需要注意的是for-of不遍历普通对象,ES6引进的另⼀个⽅式也能实现遍历数组的值,那就是Iterator。