for...in和for...of的区别

简介: 前言在JavaScript中遍历数组通常是使用for...i循环,在ES5具有遍历数组功能的还有forEach、map、filter、some、every、reduce、reduceRight等。for...in和for...of是两种增强型循环,for...in是ES5标准,在ES6中新增了for...of的循环方式。

1.for...in


for...in可以遍历对象、数组。


遍历数组:

Array.prototype.method=function(){
  console.log(this.length);
}
let arr = [1, 2, 4, 5, 7];
for (let index in arr) {
    console.log(arr[index]);
    console.log(typeof index);
}


结果:3.png


有上段代码可以总结出for...in遍历数组的特点:

  • 遍历的索引为字符串类型
  • 遍历顺序可能不是按照数组顺序(随机顺序)
  • 使用for in会遍历数组所有的可枚举属性,包括原型。


所以for...in更适合遍历对象,不要使用for in遍历数组。


遍历对象:

Object.prototype.method = function () {
    console.log(this);
}
let obj = {
    name: "张三",
    age: 22
}
for (let key in obj) {
    console.log(key);
    console.log(obj[key]);
}


遍历的索引值即key值。4.png


所以从以上来看,for...in更适合用来遍历对象


2.for...of


for-of可以简单、正确地遍历数组(不遍历原型method和name)。


遍历数组:

let myArray = [1, 2, 4, 5, 6, 7];
myArray.name = "数组";
myArray.getName = function () { return this.name; }
for (let value of myArray) {
    console.log(value);
    console.log(typeof value)
}

结果:5.png


从上面输出结果可以看出,使用for...of遍历数组得到了正确的值和索引。


3.JavaScript中可迭代对象


  • Set
  • Map
  • String
  • Array
  • Arguments
  • NodeList


如何判断是否有迭代能力?

Array.prototype.hasOwnProperty(Symbol.iterator)



4.总结


  • for...in可以遍历对象和数组,for...of不能遍历对象
  • for...in 循环不仅遍历数字键名,还会遍历手动添加的其它键,甚至包括原型链上的键
  • for...in遍历的索引为字符串类型
  • for..of适用遍历数/数组对象/字符串/map/set等拥有迭代器对象的集合,但是不能遍历对象
  • for...of与forEach()不同的是,它可以正确响应break、continue和return语句
  • 具有迭代器对象才可以使用for...of


总结一句话就是遍历数组使用for...of,遍历对象使用for...in。

相关文章
|
存储 编解码
MATLAB | 科研绘图第十八期散点密度图
MATLAB | 科研绘图第十八期散点密度图
510 0
|
人工智能 JSON Rust
用 Rust 实现敏感信息拦截插件,提升 AI 网关安全防护能力
本⽂对敏感信息拦截插件的使用方式和实现原理进行了简单介绍,它能够自动检测并处理请求和响应中的敏感词,有效防止敏感信息泄露。通过对不同数据范围的支持和灵活的配置选项,该插件能够适应各种应用场景,确保数据的安全性和合规性。
524 106
|
索引
Layui 内置方法 - layer.prompt_(输入层)
Layui 内置方法 - layer.prompt_(输入层)
1212 0
|
10月前
|
监控 安全 Apache
什么是Apache日志?为什么Apache日志分析很重要?
Apache是全球广泛使用的Web服务器软件,支持超过30%的活跃网站。它通过接收和处理HTTP请求,与后端服务器通信,返回响应并记录日志,确保网页请求的快速准确处理。Apache日志分为访问日志和错误日志,对提升用户体验、保障安全及优化性能至关重要。EventLog Analyzer等工具可有效管理和分析这些日志,增强Web服务的安全性和可靠性。
288 9
|
6月前
|
存储 数据采集 机器学习/深度学习
LIDC-IDRI肺结节数据集分割策略
本文介绍了使用LIDC-IDRI开源数据集进行肺癌检测项目的完整流程,包括数据预处理、训练分割模型和分类模型三个主要步骤。首先,下载包含患者DICOM文件的数据集;其次,克隆预处理代码并配置Pylidc库以生成肺部遮罩图像;最后,通过脚本准备数据集并创建元数据文件。文章还提供了相关GitHub资源链接,帮助读者更好地理解和实现项目。
848 11
LIDC-IDRI肺结节数据集分割策略
|
TensorFlow 算法框架/工具 C++
构建NLP 开发问题之如何将模型导出为 ONNX、TensorRT 或 Tensorflow 格式以便部署
构建NLP 开发问题之如何将模型导出为 ONNX、TensorRT 或 Tensorflow 格式以便部署
|
数据安全/隐私保护 Python
Python中的MD5加密“解密”
Python中的MD5加密“解密”
331 0
|
Python
Pygame-贪吃蛇
Pygame-贪吃蛇
107 2
|
人工智能 自然语言处理 安全
生成式人工智能服务安全评估需要找第三方吗
生成式人工智能技术,是指具有文本、图片、音频、视频等内容生成能力的模型及相关技术。《生成式人工智能服务管理暂行办法》明确,提供具有舆论属性或者社会动员能力的生成式人工智能服务的,应当按照国家有关规定开展安全评估。
【21天python打卡】第10天 网络python(1)
​大家好,今天是21天python打卡的第10天,上一篇讲了python的源码打包和网络编程。今天说说正则表达式。
【21天python打卡】第10天 网络python(1)