js中4种遍历语法比较
前言:本文主要比较for、for-in、forEach和for-of的异同以及优缺点。
for
for循环是最原始最易理解的循环遍历方式
for(var index = 0;index < arr.length;index++){
console.log(arr[index])
}
- 使用continue和break可以跳出本次循环和退出循环
forEach
上述for循环的写法比较繁琐,因此数组提供了内置的forEach方法
arr.forEach((item, index) => {
consoel.log(item)
})
注意:
- forEach的写法带来了便利,但由于其每次循环实际上是一个回调函数,因此在函数内部无法用continue和break(用于循环)跳出循环
- 可以用return跳出本次循环(相当于continue),而要退出循环只能抛出错误
var arr = [1,2,3]
arr.forEach((item) => {
if (item === 2){
return;// 跳出本次循环
}
console.log(item)
}
// 输出1,3
try {
arr.forEach((item) => {
if (item === 2){
throw new Error() // 退出循环
}
console.log(item)
})
} catch(e) {}
// 输出1
for-in
for-in主要为遍历对象而设计,也可以遍历数组的键名。
for-in有几个特点,通常情况下被认为是缺点:
- 数组的键名是数字,但for-in循环是以字符串作为键名
var arr = ['a']
for(var item in arr){
console.log(item, typeof item)
}
// 1, string
- for-in循环无法保证对数组的遍历顺序(遍历对象时也无法保证),由于数组是以键值对的形式存储(详情可见js的数组在内存中是如何存储的),因此其无法保证遍历顺序的原因与遍历对象一致,详情可见js中对象的输出顺序
- for-in会遍历所有可枚举属性(包括原型链上的属性),且由于js中数组是以键值对的形式存储,因此数组的非索引属性也会被遍历
var arr = ['a', 'b']
Array.prototype.protoName = '原型属性'
arr.name = '非索引属性'
for(var item in arr){
console.log(arr[item])
}
// a,b,'非索引属性','原型属性'
可以发现,for-in不仅遍历了原型链上的属性,新增的非索引属性name页被遍历,因此for-in不适合遍历数组。(由于length等属性是不可枚举属性,因此没有被遍历)
- for-in循环性能较差
由于每次循环,for-in不仅会搜索实例属性,还会搜索原型属性,因此相比于其他循环方式,for-in的速度较慢。
var arr = new Array(10000)
for(var i=0;i< 10000;i++){
arr[i]=i
}
var length = arr.length
console.time('for')
for (var index=0; index< length; index++){
//
}
console.timeEnd('for')
console.time('for-in')
for(var index in arr){
//
}
console.timeEnd('for-in')
// for:0.2839ms
// for-in: 1.1479ms
因此,除非需要迭代一个属性数量未知的对象,否则并不适合用for-in循环。
以上for-in的特性,在平常开发中共基本上都是缺点,但有一种可能算是优点的特性:for-in只会遍历数组中存在的实体
var arr = new Array(3)
arr[2] = 'hello world'
var length = arr.length
for (var index=0; index< length; index++){
console.log(arr[index])
}
// undefined,undefined, 'hello world'
for(var index in arr){
console.log(arr[index])
}
// 'hello world'
可以看到for-in会忽略数组中为定义的部分,可以用于遍历长度很大的稀疏数组。)
for-of
相比于以上几点,for-of几乎结合了它们的所有优点:
- 有着for-in一样简单的语法,但没有for-in的缺点
- 不同于forEach,for-of可以使用break和continue跳出循环
- 提供了遍历所有数据结构的统一操作接口
- 不仅支持对象和数组的遍历,for-of支持一切可迭代对象的遍历,包括类数组、字符串的遍历;它将字符串视为一系列Unicode字符来遍历。
但需要注意,普通对象不是可迭代对象,不能用for-of遍历。想要迭代一个对象,可以用for-in,也可以将对象使用Map数据结构。
js中4种遍历语法比较的更多相关文章
- JS中几种常见的数组算法(前端面试必看)
JS中几种常见的数组算法 1.将稀疏数组变成不稀疏数组 /** * 稀疏数组 变为 不稀疏数组 * @params array arr 稀疏数组 * @return array 不稀疏的数组 */ f ...
- js中的数组遍历
js中的数组遍历是项目中经常用到的,在这里将几种方法做个对比. ! for循环:使用评率最高,也是最基本的一种遍历方式. let arr = ['a','b','c','d','e']; for (l ...
- [转]js中几种实用的跨域方法原理详解
转自:js中几种实用的跨域方法原理详解 - 无双 - 博客园 // // 这里说的js跨域是指通过js在不同的域之间进行数据传输或通信,比如用ajax向一个不同的域请求数据,或者通过js获取页面中不同 ...
- 关于js中两种定时器的设置及清除(转载)
1.JS中的定时器有两种: window.setTimeout([function],[interval]) 设置一个定时器,并且设定了一个等待的时间[interval],当到达时间后,执行对应的方法 ...
- [js]js中4种无节操的预解释情况
js中4种无节操的预解释情况 - 1. if语句即使条件不成立,条件里的表达式也会进行预解释. - 2. 匿名函数的预解释: 只对等号左边与解释 - 3. 自执行函数的预解释: 不进行预就解释, 执行 ...
- [js]js中6种错误处理机制
js中6种错误 http://javascript.ruanyifeng.com/grammar/error.html#toc5 https://www.jianshu.com/p/467b9a145 ...
- js中三种定义变量 const, var, let 的区别
js中三种定义变量的方式const, var, let的区别 1.const定义的变量不可以修改,而且必须初始化. 1 const b = 2;//正确 2 // const b;//错误,必须初始化 ...
- js中三种弹出框
javascript的三种对话框是通过调用window对象的三个方法alert(),confirm()和prompt()来获得,可以利用这些对话框来完成js的输入和输出,实现与用户能进行交互的js代码 ...
- phpcms抛出的二维数组转移到js,js中for....in遍历数组,用“.”连接来读出一维数组值
直切正题: 1.phpcms在模版中读出数组有很多中方法,如,{pc:content action="lists"}或{pc:get sql=""},经过{lo ...
随机推荐
- Eclipse一些技巧
1:测试某个测试溢出,修改堆内存大小 // 模拟内存溢出 -Xms10m -Xmx10m private static void mockOOM() { List list = new ArrayLi ...
- CSS定位以及z-index属性(层叠性)的详解(转)
https://blog.csdn.net/weixin_41342585/article/details/79484879
- 阿里云Centos7 搭建laravel
最近在考虑学习laravel框架,唔 现在服务器搭建一下. laravel是依赖composer的,首先在linux服务器下先安装composer.运行composer需要 php 5.3以上版本, ...
- .Net Core Swagger:Actions require an explicit HttpMethod binding for Swagger 2.0
添加完Swagger包引用后运行报错:Actions require an explicit HttpMethod binding for Swagger 2.0 第一时间想到了父类控制器 没有添加 ...
- VMware Workstation中虚拟机与windows10共享文件夹
设置共享文件夹之前需要确定已经安装VMware Tools 1.在windows桌面新建一个名为share_folder的文件夹用来共享 2.右键点击虚拟机的名字,在弹出的菜单中选择设置 弹出对话框 ...
- 参数化查询防止Sql注入
拼接sql语句会造成sql注入,注入演示 namespace WindowsFormsApp1 { public partial class Form1 : Form { public Form1() ...
- golang GC(二 定位)
前面已经介绍过golang的GC算法.要是我们的程序在运行是因为GC导致行能下降,该如何定位呢?说实话,工作中由于对go的gc问题不重视,根本没考虑过这个问题,今天特意来补补课.
- javaWeb文件上传与下载
文件上传与下载在项目中运用的使用频率很大 今天也花时间整理了一下 多文件上传图片回显 和文件下载 1.多文件上传 这里会涉及到几个属性 fileSizeThreshold:缓冲区文件的大小 如果上传 ...
- nginx简单反向代理实例
一.要做什么? 实例最后实现的效果图: 我们在浏览器地址栏上输入 wangtong,代理服务器获取请求,将请求转发至指定的 tomcat 上 二.怎样做? 1.准备环境 虚拟中中需要安装 JDK+To ...
- PAT Basic 1053 住房空置率 (20 分)
在不打扰居民的前提下,统计住房空置率的一种方法是根据每户用电量的连续变化规律进行判断.判断方法如下: 在观察期内,若存在超过一半的日子用电量低于某给定的阈值 e,则该住房为“可能空置”: 若观察期超过 ...