zoukankan      html  css  js  c++  java
  • js遍历for,forEach, for in,for of

    ECMAScript5(es5)有三种for循环

    • 简单for

    • for in

    • forEach

    ECMAScript6(es6)新增

    • for of

    简单for

    for是循环的基础语法,也是最常用的循环结构。没有兼容性问题,效率上:for > forEach > map >for in

    forEach

    forEach由es5提出,属于数组的迭代方法

    概述: 方法让数组的每一项都执行一次给定的函数。

    语法: array.forEach(callback[currentValue,index,array,thisArg]);

    参数:

    • currentValue:当前遍历项。

    • index:当前项目的下标

    • array:当前数组本身

    • thisArg:修改内部值的指向。

    特点:

    forEach 方法为数组中含有有效值的每一项执行一次 callback 函数,那些已删除(使用 delete 方法等情况)或者从未赋值的项将被跳过(不包括那些值为 undefined 或 null 的项)。
    forEach 遍历的范围在第一次调用 callback 前就会确定。调用forEach 后添加到数组中的项不会被 callback 访问到。如果已经存在的值被改变,则传递给 callback 的值是 forEach 遍历到他们那一刻的值。已删除的项不会被遍历到。

    优点:

    foreach会跳过数组中的空位
    相对for来说更语义化

    缺点:

    不能中断循环,也不支持 continuebreak,只能通过 return 来控制循环,但是不能退出循环本身。

    兼容性: 只支持IE9及以上
    性能: forEach 的速度不如 for

    for in

    此循环有一个特殊的用途:可以枚举任何对象的命名属性。实际上它是为循环”enumerable“对象而设计的。

    需要注意的是,for-in 循环遍历的是对象的属性,而不是数组的索引。由于对象的属性没有顺序,for in循环输出的输出的属性名也是不可预测的

    性能:

    由于每次迭代操作要搜索实例或原型属性, for-in 循环的每次迭代都会产生更多开销,因此执行速度比其他循环类型慢。在同样的循环迭代操作中,其它类型循环速度要比它快7倍之多。除非对数目不详的对象属性进行操作,否则我们不推荐使用for in 循环。

    Array 的真相
    
    Array 在 Javascript 中是一个对象, Array 的索引是属性名。事实上, Javascript 中的 “array” 有些误导性, Javascript 中的 Array 并不像大部分其他语言的数组。
    首先, Javascript 中的 Array 在内存上并不连续,其次, Array 的索引并不是指偏移量。实际上, Array 的索引也不是 Number 类型,而是 String 类型的。
    我们可以正确使用如 arr[
    0] 的写法的原因是语言可以自动将 Number 类型的 0 转换成 String 类型的 "0" 。
    所以,在 Javascript 中从来就没有 Array 的索引,而只有类似 "0" 、 "1" 等等的属性。有趣的是,每个 Array 对象都有一个 length 的属性,导致其表现地更像其他语言的数组。
    但为什么在遍历 Array 对象的时候没有输出 length 这一条属性呢?那是因为 for-in 只能遍历“可枚举的属性”, length 属于不可枚举属性,实际上, Array 对象还有许多其他不可枚举的属性。

    es6的for of

    for of是由es6提出的,目的是作为遍历所有数据结构的统一方法。

    我们先来回顾一下此前js的遍历方法:

    • foreach是为便利数组而设计的,不能正确响应break、continue和return语句

    • for in被设计用来枚举对象的属性的,遍历对象的属性

    • for in用在数组上,除了遍历数组元素以外,还会遍历自定义属性,甚至原型链上的属性,另外,遍历顺序是随机的

    那么for of 有什么不一样呢?

    特点:

    • 语法同for in一样简洁,但避开了for in的缺陷

    • 能正确响应break、continue和return语句

    • 跟for in不一样,数组的遍历器接口只返回具有数字索引的属性

    • for in读取的是对象的键名,for of读取的是键值

    • 提供遍历所有数据结构的统一方法。for of不仅可以遍历数组,还可以遍历Set、Map结构,某些类似数组的对象(如:argument对象、DOM NodeList对象),Generator对象,以及字符串。

    如:
    let arr = ['a' ,'b', 'c', 'd'];
    let itr = arr[Symbol.iterator];
    
    arr.forEach(function(val, index, arr){
        console.log(val); // a b c d
        console.log(index); // 0 1 2 3
    });
    
    for(let i of itr){
        console.log(i);  // a b c d
    }
    
    for(let i of arr){
        console.log(i);  // a b c d
    }
    
    for(let i in arr){
        console.log(i);  // 0 1 2 3
    }

    只要具有Iterator接口的数据结构,都可以使用for of循环遍历它的成员。关于Iterator,如果还不清楚的可以先去了解一下,这里就不赘述了。这里需要注意一下,由于for of读取的是键值,如果想通过for of获取键名,可以借助数组实例的entries和keys方法。

  • 相关阅读:
    C# 文件操作 全收录 追加、拷贝、删除、移动文件、创建目录、递归删除文件夹及文件....
    FlexPaper在线文档分享(转载)
    winform中屏蔽对标题栏的操作
    【转】海量数据查询优化
    [转帖]用Reflector和FileDisassembler配合反编译.net Windows程序
    关于中缀表达式和逆波兰表达式(终结篇)
    jQuery教程基础篇之强大的选择器(层次选择器)
    模版方法(Template Method)
    VS2008新建项目时出现“此安装不支持该项目类型”
    并行计算相关文章
  • 原文地址:https://www.cnblogs.com/sghy/p/7356681.html
Copyright © 2011-2022 走看看