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 相关文章推荐
JavaScript中__proto__与prototype的关系深入理解
Dec 04 Javascript
javascript实现数字+字母验证码的简单实例
Feb 10 Javascript
谷歌地图打不开的解决办法
Aug 07 Javascript
node.js中的fs.chownSync方法使用说明
Dec 16 Javascript
jQuery满意度星级评价插件特效代码分享
Aug 19 Javascript
实例讲解JavaScript中instanceof运算符的用法
Jun 08 Javascript
利用Angularjs和bootstrap实现购物车功能
Aug 31 Javascript
JQuery统计input和textarea文字输入数量(代码分享)
Dec 29 Javascript
如何通过非数字与字符的方式实现PHP WebShell详解
Jul 02 Javascript
Angularjs添加排序查询功能的实例代码
Oct 24 Javascript
十分钟教你上手ES2020新特性
Feb 12 Javascript
ES5和ES6中类的区别总结
Dec 21 Javascript
vue+django实现下载文件的示例
javascript实现用户必须勾选协议实例讲解
JavaScript实现前端网页版倒计时
vue路由实现登录拦截
vue项目实现分页效果
Mar 24 #Vue.js
jQuery treeview树形结构应用
Mar 24 #jQuery
js实现弹框效果
Mar 24 #Javascript
You might like
PHP中把错误日志保存在系统日志中(Windows系统)
2015/06/23 PHP
Thinkphp框架开发移动端接口(1)
2016/08/18 PHP
Javascript this关键字使用分析
2008/10/21 Javascript
JS完成代码前最好对其做5件事
2013/04/07 Javascript
JS动态显示表格上下frame的方法
2015/03/31 Javascript
Jquery实现select multiple左右添加和删除功能的简单实例
2016/05/26 Javascript
jquery 无限极下拉菜单的简单实例(精简浓缩版)
2016/05/31 Javascript
JavaScript构建自己的对象示例
2016/11/29 Javascript
JS作用域闭包、预解释和this关键字综合实例解析
2016/12/16 Javascript
原生JS实现跑马灯效果
2017/02/20 Javascript
关于 angularJS的一些用法
2017/11/29 Javascript
jQuery实现的电子时钟效果完整示例
2018/04/28 jQuery
Vue-cli@3.0 插件系统简析
2018/09/05 Javascript
javascript写一个ajax自动拦截并下载数据代码实例
2019/09/07 Javascript
原生js+canvas实现验证码
2020/11/29 Javascript
Python中字符串的处理技巧分享
2016/09/17 Python
详解Python中 sys.argv[]的用法简明解释
2017/12/20 Python
python中使用iterrows()对dataframe进行遍历的实例
2018/06/09 Python
Django框架用户注销功能实现方法分析
2019/05/28 Python
python GUI库图形界面开发之PyQt5时间控件QTimer详细使用方法与实例
2020/02/26 Python
python GUI库图形界面开发之PyQt5打开保存对话框QFileDialog详细使用方法与实例
2020/02/27 Python
使用 Python 遍历目录树的方法
2020/02/29 Python
如何用python写个模板引擎
2021/01/14 Python
针对HTML5的Web Worker使用攻略
2015/07/12 HTML / CSS
wordpress添加Html5的表单验证required方法小结
2020/08/18 HTML / CSS
JAVA语言如何进行异常处理,关键字:throws,throw,try,catch,finally分别代表什么意义?在try块中可以抛出异常吗?
2013/07/02 面试题
毕业生自我推荐
2013/11/04 职场文书
会计专业应届生求职信
2013/11/24 职场文书
面试后的英文感谢信
2014/02/01 职场文书
开业庆典策划方案
2014/02/18 职场文书
合伙经营协议书
2014/04/18 职场文书
年终奖发放方案
2014/06/02 职场文书
车辆工程专业求职信
2014/06/14 职场文书
劳动竞赛口号
2014/06/16 职场文书
水污染治理工程专业自荐信
2014/06/21 职场文书
运动员加油词
2015/07/18 职场文书