JavaScript 语句之常用 for 循环详解

JavaScript中循环语句不少,for、for in、for of和forEach循环,今天对比Array、Object、Set(ES6)、Map(ES6)四种数据结构循环语句支持的情况及区别。

Posted in Javascript onMarch 29, 2021

新建四种数据类型的测试数据

let arr = [1, 2, 3, 4, 5, 6];
let obj = { a: 1, b: 2, c: 3 };
let map = new Map([['a', 'a1'], ['b', 'b2'], ['c', 'c3']]);
let set = new Set(['a', 'b', 'c']);

1 for

普通for循环在 Array 中可以使用。 遍历数组时,是遍历数组 下标 索引,通过下标去取值。

for (let i = 0; i < arr.length; i++) { // i是下标(索引)
  console.log(i)
  console.log(arr[i])
}

2 for in

for in 在 Array 和 Object 中都可以使用。需要注意的是,在原型上的属性,也会被循环出来。

Array

let arr = [1, 2, 3, 4, 5, 6];
Array.prototype.a = "1"
 
for (let i in arr) {  // i是下标(索引)
  console.log(i)
  console.log(arr[i])
}

可以看到原型上的也被循环出来了,只并不是我们想要的,我们可以通过 hasOwnProperty过滤掉原型上的属性。

let arr = [1, 2, 3, 4, 5, 6];
Array.prototype.a = "1"
 
for (let i in arr) {  // i是下标(索引)
  if (arr.hasOwnProperty(i)) {
    console.log(i)
    console.log(arr[i])
  }
}

Object

let obj = { a: 1, b: '2', c: 3 };
Object.prototype.d = 4
 
for (let key in obj) {  // key是键
  console.log(key)
  console.log(obj[key])
}

对于Object也是会存在同样问题,原型上的也会被循环出来,同样也可以通过 hasOwnPr operty 过滤 掉原型上的属性 。

for (let key in obj) {  // key是键
  if (obj.hasOwnProperty(key)) {
    console.log(key)
    console.log(obj[key])
  }
}

3 for of

for of在Array、Object、Set、Map中都可以使用。

Array

Array本质上也是对象,所以我们可以在隐式原型(__proto__)上可以找到定义好的方法。

for (let key of arr.keys()) {  // key是下标
  console.log(key)
}
for (let value of arr) {     // value是值
  console.log(value)
}
for (let value of arr.values()) { // value是值
  console.log(value)
}
for (let [key, value] of arr.entries()) { // key是下标 value是值
  console.log(key,value)
}

Object

for (let [key, value] of Object.entries(obj)) { // key是下标 value是值
  console.log(key, value)
}

Set

由于Set是没有重复的,所以keys和values是一致的,也就是说下面四个输出是一致的

for (let key of set.keys()) {  
  console.log(key)
}
for (let value of set) {     
  console.log(value)
}
for (let value of set.values()) { 
  console.log(value)
}
for (let [key, value] of set.entries()) { 
  console.log(key, value)
}

Map

for (let key of map.keys()) { 
  console.log(key)
}
for (let value of map) {     
  console.log(value)
}
for (let value of map.values()) { 
  console.log(value)
}
for (let [key, value] of map.entries()) { 
  console.log(key, value)
}

可以使用break,continue语句跳出循环,或者使用return从函数体返回。

for (let key of arr.keys()) {  // key是下标
  if (key == 3) {
    return
  }
  console.log(key)
}
for (let key of arr.keys()) {  // key是下标
  if (key == 3) {
    break
  }
  console.log(key)
}
for (let key of arr.keys()) {  // key是下标
  if (key == 3) {
    continue
  }
  console.log(key)
}

4 forEach

forEach循环在Array、Set、Map中都可以使用。但是方法不能使用break,continue语句跳出循环,或者使用return从函数体返回。

Array

arr.forEach((value, index) => {
  console.log(value, index)
})

Set

set.forEach((value, key) => {
  console.log(value, key)
})

Map

map.forEach((value, key) => {
  console.log(value, key)
})

break,continue和return

使用continue会提示

Illegal continue statement: no surrounding iteration statement

使用break会提示

Illegal break stateme

5 总结

普通 for 循环在 Array 中可以使用。遍历数组时,是遍历数组下标索引,通过下标去取值;for in 在 Array 和 Object 中都可以使用。但需要注意的是,在原型上的属性,也会被循环出来;for of 在Array、Object、Set、Map中都可以使用。也可以使用break,continue和return;forEach循环在Array、Set、Map中都可以使用。但是方法不能使用break,continue语句跳出循环,或者使用return从函数体返回。

Javascript 相关文章推荐
基于jQuery的ajax功能实现web service的json转化
Aug 29 Javascript
获取网站跟路径的javascript代码(站点及虚拟目录)
Oct 20 Javascript
JQuery toggle使用分析
Nov 16 Javascript
CSS和Javascript简单复习资料
Jun 29 Javascript
css值转换成数值请抛弃parseInt
Oct 24 Javascript
JavaScript设计模式之外观模式介绍
Dec 28 Javascript
用Angular实时获取本地Localstorage数据,实现一个模拟后台数据登入的效果
Nov 09 Javascript
JavaScript 限制文本框不可输入英文单双引号的方法
Dec 20 Javascript
使用bootstrap插件实现模态框效果
May 10 Javascript
使用jQuery实现动态添加小广告
Jul 11 jQuery
教你用Cordova打包Vue项目的方法
Oct 17 Javascript
js实现图片上传即时显示效果
Sep 30 Javascript
vue+django实现下载文件的示例
javascript实现用户必须勾选协议实例讲解
JavaScript实现前端网页版倒计时
vue路由实现登录拦截
vue项目实现分页效果
Mar 24 #Vue.js
jQuery treeview树形结构应用
Mar 24 #jQuery
js实现弹框效果
Mar 24 #Javascript
You might like
Classes and Objects in PHP5-面向对象编程 [1]
2006/10/09 PHP
一个高ai的分页函数和一个url函数
2006/10/09 PHP
分享PHP入门的学习方法
2007/01/02 PHP
PHP获取网站域名和地址的代码
2008/08/17 PHP
PHP设计模式之装饰者模式
2012/02/29 PHP
php检测iis环境是否支持htaccess的方法
2014/02/18 PHP
浅谈php命令行用法
2015/02/04 PHP
PHP实现导出excel数据的类库用法示例
2016/10/15 PHP
使用typeof方法判断undefined类型
2014/09/09 Javascript
使用JavaScript开发IE浏览器本地插件实例
2015/02/18 Javascript
javascript显示上周、上个月日期的处理方法
2016/02/03 Javascript
javascript笔记之匿名函数和闭包
2017/02/06 Javascript
vue+vux实现移动端文件上传样式
2017/07/28 Javascript
React学习之事件绑定的几种方法对比
2017/09/24 Javascript
关于laydate.js加载laydate.css路径错误问题解决
2017/12/27 Javascript
Webpack 4.x搭建react开发环境的方法步骤
2018/08/15 Javascript
layui中select,radio设置不生效的解决方法
2019/09/05 Javascript
vue框架制作购物车小球动画效果实例代码
2019/09/26 Javascript
vue+koa2搭建mock数据环境的详细教程
2020/05/18 Javascript
Nodejs实现WebSocket代码实例
2020/05/19 NodeJs
[15:35]教你分分钟做大人:天怒法师
2014/10/30 DOTA
python定时检查启动某个exe程序适合检测exe是否挂了
2013/01/21 Python
python实现删除文件与目录的方法
2014/11/10 Python
Python函数中定义参数的四种方式
2014/11/30 Python
Python如何为图片添加水印
2016/11/25 Python
Python机器学习算法之k均值聚类(k-means)
2018/02/23 Python
Python各类图像库的图片读写方式总结(推荐)
2018/02/23 Python
Python 批量合并多个txt文件的实例讲解
2018/05/08 Python
python mysql中in参数化说明
2020/06/05 Python
Python修改DBF文件指定列
2020/12/19 Python
CSS3 transforms应用于背景图像的解决方法
2019/04/16 HTML / CSS
海蓝之谜英国官网:La Mer英国
2020/01/15 全球购物
先进班集体申报材料
2014/12/26 职场文书
怎样写离婚协议书
2015/01/26 职场文书
Python 游戏大作炫酷机甲闯关游戏爆肝数千行代码实现案例进阶
2021/10/16 Python
Nginx+Windows搭建域名访问环境的操作方法
2022/03/17 Servers