平时自己在写一些小栗子的时候,用到的基本上是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];
arr.name = "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";
arr.name = "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。

这里我只是简单总结了一点点,自己也认真看了书上的知识,推荐一篇写的很好的。https://zhuanlan.zhihu.com/p/23812134?utm_source=tuicool&utm_medium=referral

for循环、for-in、forEach、for-of四大循环的更多相关文章

  1. JavaScript里的循环方法:forEach,for-in,for-of

    JavaScript诞生已经有20多年了,我们一直使用的用来循环一个数组的方法是这样的: for (var index = 0; index < myArray.length; index++) ...

  2. js forEach参数详解,forEach与for循环区别,forEach中如何删除数组元素

     壹 ❀ 引 在JS开发工作中,遍历数组的操作可谓十分常见了,那么像for循环,forEach此类方法自然也不会陌生,我个人也觉得forEach不值得写一篇博客记录,直到我遇到了一个有趣的问题,我们来 ...

  3. foreach(增强for循环)和for的区别

    https://www.cnblogs.com/XiaojianGo/p/7471860.html 首先说一下foreach有的也叫增强for循环,foreach其实是for循环的一个特殊简化版. 再 ...

  4. Java 中的foreach(增强for循环)

    foreach概述 增强for循环:底层使用的是送代器,使用for循环的格式,简化了送代器的书写,foreach是JDK1.5之后出现的新特性 使用增强for循环 遍历集合 /** * 遍历集合 * ...

  5. C#语句2——循环语句(for循环与for循环嵌套)

    循环:反复执行某段代码. 循环四要素:初始条件,循环条件,循环体,状态改变. for(初始条件;循环条件;状态改变) { 循环体 } break ——中断循环,跳出整个循环 continue——停止本 ...

  6. 【Javascript】: for循环中定义的变量在for循环体外也有效

    for循环中定义的变量在for循环体外也有效 <script> (function(){ var a = 111; for(var i=0;i<5;i++){ var carl = ...

  7. js 实现图片间隔循环轮播以及没有间隔的循环轮播

    链接地址:http://blog.sina.com.cn/s/blog_75cf5f32010199dn.html 最近做了个图片循环轮播的功能.就是几张图片不断的循环滚动显示. 感觉这个方法不错所以 ...

  8. (2)流程控制(for循环、if...else判断、while循环)

    for循环 for item in names:  #结构语法 print(item) for循环嵌套for循环 for循环配合range()可以直接指定要打印的数量 例:打印一个金字塔 for i ...

  9. 退出循环break,在while、for、do...while、循环中使用break语句退出当前循环,直接执行后面的代码。

    在while.for.do...while循环中使用break语句退出当前循环,直接执行后面的代码. 格式如下: for(初始条件;判断条件;循环后条件值更新) { if(特殊情况) {break;} ...

随机推荐

  1. 【转】png文件格式

    前言 我们都知道,在进行J2ME的手机应用程序开发的时候,在图片的使用上,我们可以使用PNG格式的图片(甚至于在有的手机上,我们只可以使用PNG 格式的图片),尽管使用图片可以为我们的应用程序增加不少 ...

  2. 11个让你吃惊的linux命令

    我已经用了十年的Linux了,通过今天这篇文章我将向大家展示一系列的命令.工具和技巧,我希望一开始就有人告诉我这些,而不是曾在我成长道路上绊住我. AD: 我已经用了十年的Linux了,通过今天这篇文 ...

  3. Docker壳的配置笔记

    docker 就是一个运行容器,在这个盒子里,他的端口,路径可以虚拟到另一个实际的磁盘上,运行空间独立,更安全! yum install -y docker docker-client service ...

  4. Python——format()/str.format()函数

    格式化输出,除了类似于C语言的格式化输出外,还有str.format()方法,Python内建的format()函数,允许用户将待输出值以参数的形式,调用format()函数,在Python交互式sh ...

  5. [vim]使用中问题

    bug1: vim文档中文注释为乱码 step1: vim /var/lib/locales/supported.d/local 在其中添加下面的中文字符集 zh_CN.GBK GBK zh_CN.G ...

  6. 数据库索引(Index)【未完待续】

    数据库索引是啥?有什么用?原理是什么?最佳实践什么? 索引是啥 一个索引是这样的数据结构:从数据上来说,不仅包含了从表中某一列或多列的数据拷贝,同时,还包含了指向这列数据行的链接: 从结构上来说,索引 ...

  7. 解决错误:此用户名包含无效字符,请输入有效的用户名。wordpress不能注册中文用户名的问题

    wordpress在默认情况下不支持中文用户名,就是在后台添加用户的时候,如果用户名包含中文,则显示”错误:此用户名包含无效字符,请输入有效的用户名.”如何解决这个问题呢? 不用插件的话就需要修改一个 ...

  8. 196. Delete Duplicate Emails

    Write a SQL query to delete all duplicate email entries in a table named Person, keeping only unique ...

  9. gulp配合vue压缩代码格式化

    实际项目就是一个单页面.因此,我觉得用gulp足够,并且不需要webpack和vue-cli因为没有必要使用组件. 先来说一下项目结构 1. 然后来看看我的包管理package.json都用了啥,你也 ...

  10. 【剑指offer】面试题 17. 打印从 1 到最大的 n 位数

    面试题 17. 打印从 1 到最大的 n 位数 题目描述 题目:输入数字 n,按顺序打印出从 1 最大的 n 位十进制数.比如输入 3,则打印出 1.2.3 一直到最大的 3 位数即 999. 解答过 ...