当前位置: 首页 > news >正文

[JavaScript]_[初级]_[关于forin或for...in循环语句的用法]

场景

  1. 在使用 JavaScript 开发或阅读代码时,会遇到forin语法的循环语句。这个循环语句到底会遍历什么数据?

说明

  1. 用于迭代具有可枚举属性的对象(除了Symbol内置对象).

  2. 可以枚举Map对象,因为它都是键值对的形式。

  3. 迭代可枚举属性的顺序不确定的。

  4. 不适用于基于索引顺序的数组,因为不一定按照索引顺序迭代。如果是迭代数组,使用常规for...i循环或者使用数组的内置方法forEach(function(item)).

  5. 语法

    for (variable in object)
      statement
    
  6. 可使用let,const,var来声明variable.

  7. 使用对象内置的hasOwnProperty()方法来判断是否是直接属性,而不是继承过来的。

  8. 使用obj.propertyIsEnumerable(prop)来判断是否某个属性是否可枚举。

  9. for...in是为了枚举对象属性构建的,常用在调试时输出到控制台。

例子

<html>
    <body>
        <p id="out">for...in</p>
    </body>
    <script>
        function print(str){
            let p = document.createElement("p");
            p.innerHTML = str;
            document.body.append(p)
        }

        let visitData = {url:"https://blog.csdn.net/infoworld",action:"subcribe"};
        
        print("1. 遍历可枚举属性.");
        for(const p in visitData)
            print(`${p}=${visitData[p]}`);
        

        function User() {
          this.color = 'red';
        }

        User.prototype = visitData;

        print("2. 遍历继承的可枚举属性");
        let user = new User();
        for(const p in user)
            print(`${p}=${user[p]}`);
        
        print("3. 只遍历自身可枚举属性");
        for(const p in user){
            if(user.hasOwnProperty(p))
                print(`${p}=${user[p]}`);
        }

        print("4. for...in不应该用于迭代一个关注索引顺序的 Array");
        let jsonArray = ['https://blog.csdn.net/infoworld','Tobey'];
        for(const i in jsonArray)
            print(`${i}=${jsonArray[i]}`);

        print("5. 使用数组forEach方法遍历数组");    
        jsonArray.forEach(one => {
            print(one);
        });
        
        print("6. 遍历p元素可枚举属性");
        const p = document.getElementById("out");
        for(const prop in p){
            print(`${prop}=${p[prop]}`);
        }
    </script>
</html>

输出

for...in

1. 遍历可枚举属性.

url=https://blog.csdn.net/infoworld

action=subcribe

2. 遍历继承的可枚举属性

color=red

url=https://blog.csdn.net/infoworld

action=subcribe

3. 只遍历自身可枚举属性

color=red

4. for...in不应该用于迭代一个关注索引顺序的 Array

0=https://blog.csdn.net/infoworld

1=Tobey

5. 使用数组forEach方法遍历数组

https://blog.csdn.net/infoworld

Tobey

6. 遍历p元素可枚举属性

align=

参考

  1. let - JavaScript | MDN

  2. for…in - JavaScript | MDN

  3. JavaScript for 循环

  4. Array.prototype.forEach() - JavaScript | MDN

  5. Symbol - JavaScript | MDN

  6. 属性的可枚举性和所有权 - JavaScript | MDN

相关文章:

  • 【MATLAB教程案例5】常见无线通信信道的matlab模拟和仿真分析——自由空间损耗模型,Okumura-Hata模型以及COST231 Hata模型
  • 【39. 最长公共子序列】
  • 计算机网络常考协议(HTTPHTTPs、TCP/UDP、DNS)
  • 服务器调制、调试和测试
  • 神经网络深度学习(三)优化器
  • Altium Dsigner 20 工艺参数设置修改
  • 2022“杭电杯” 中国大学生算法设计超级联赛(10)1 4题解
  • ssh免密登陆
  • 神经网络深度学习(二)激活函数
  • Java_Servlet处理请求流程
  • cadence SPB17.4 - allegro - modify shape
  • AJAX详细教程
  • 关于 在国产麒麟系统上使用QProcess配合管道命令执行shell命令获取预期结果输出失败 的解决方法
  • docker进阶——docker网络简解
  • 2022/09/01 day01:Git概述
  • 《网管员必读——网络组建》(第2版)电子课件下载
  • 《微软的软件测试之道》成书始末、出版宣告、补充致谢名单及相关信息
  • Apache Zeppelin在Apache Trafodion上的可视化
  • Asm.js的简单介绍
  • canvas 绘制双线技巧
  • CEF与代理
  • CentOS学习笔记 - 12. Nginx搭建Centos7.5远程repo
  • eclipse(luna)创建web工程
  • iOS小技巧之UIImagePickerController实现头像选择
  • MySQL主从复制读写分离及奇怪的问题
  • PHP 程序员也能做的 Java 开发 30分钟使用 netty 轻松打造一个高性能 websocket 服务...
  • SpringCloud(第 039 篇)链接Mysql数据库,通过JpaRepository编写数据库访问
  • 从tcpdump抓包看TCP/IP协议
  • 开年巨制!千人千面回放技术让你“看到”Flutter用户侧问题
  • 每天10道Java面试题,跟我走,offer有!
  • 悄悄地说一个bug
  • 深入浅出Node.js
  • 深入浅出webpack学习(1)--核心概念
  • 使用Maven插件构建SpringBoot项目,生成Docker镜像push到DockerHub上
  • 小程序01:wepy框架整合iview webapp UI
  • 2017年360最后一道编程题
  • 如何正确理解,内页权重高于首页?
  • ​​​​​​​​​​​​​​Γ函数
  • ​iOS安全加固方法及实现
  • # 深度解析 Socket 与 WebSocket:原理、区别与应用
  • #ubuntu# #git# repository git config --global --add safe.directory
  • (01)ORB-SLAM2源码无死角解析-(56) 闭环线程→计算Sim3:理论推导(1)求解s,t
  • (aiohttp-asyncio-FFmpeg-Docker-SRS)实现异步摄像头转码服务器
  • (二)windows配置JDK环境
  • (附源码)spring boot校园拼车微信小程序 毕业设计 091617
  • (附源码)springboot工单管理系统 毕业设计 964158
  • (小白学Java)Java简介和基本配置
  • (原創) 如何安裝Linux版本的Quartus II? (SOC) (Quartus II) (Linux) (RedHat) (VirtualBox)
  • .[hudsonL@cock.li].mkp勒索加密数据库完美恢复---惜分飞
  • .NET Core 将实体类转换为 SQL(ORM 映射)
  • .NET Core引入性能分析引导优化
  • .NET/C# 异常处理:写一个空的 try 块代码,而把重要代码写到 finally 中(Constrained Execution Regions)
  • .NET4.0并行计算技术基础(1)
  • .net开源工作流引擎ccflow表单数据返回值Pop分组模式和表格模式对比
  • .sh