for in循环和for of循环,二者区别

本文详细介绍了JavaScript中的for...of和for...in循环的区别。for...of主要用于遍历数组的元素,而for...in则遍历数组的索引或对象的属性。for...in会包括自定义属性,而for...of则不会。此外,for...in可以应用于数组和对象,而for...of仅限于数组。通过实例代码,展示了两种循环的不同输出结果,帮助开发者更好地理解和运用这两种循环语句。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、for of循环:

举个栗子1:

  <script>

var arr = ['nick','freddy','mike','james'];
for(var item of arr){	
    console.log(item);
}

  </script>

结果:
在这里插入图片描述

举个栗子2:

  <script>

var arr = [
    { name:'nick', age:18 },
    { name:'freddy', age:24 },
    { name:'mike', age:26 },
    { name:'james', age:34 }
];
for(var item of arr){	
    console.log(item.name,item.age);
}

  </script>

结果:
在这里插入图片描述

2、与for in 区别:

区别①:for of无法循环遍历对象

  <script>

var userMsg = {
    0: 'nick',
    1: 'freddy',
    2: 'mike',	
    3: 'james'
};
 
for(var key in userMsg){
    console.log(key, userMsg[key]);	
}
console.log('-----------分割线-----------');
for(var item of userMsg){	
    console.log(item);
}

  </script>

结果:
在这里插入图片描述

区别②:遍历输出结果不同

  <script>

var arr = ['nick','freddy','mike','james'];
for(var key in arr){
    console.log(key);	
}

console.log('-----------分割线-----------');
for(var item of arr){	
    console.log(item);
}

  </script>

结果:
在这里插入图片描述
for in循环遍历的是数组的键值(索引),而for of循环遍历的是数组的值。

区别③:for in 会遍历自定义属性,for of不会

  <script>

var arr = ['nick','freddy','mike','james'];
arr.name = "数组";
 
for(var key in arr){
    console.log(key+': '+arr[key]);	
}

console.log('-----------分割线-----------');
for(var item of arr){	
    console.log(item);
}

  </script>

结果:
在这里插入图片描述
给数组添加一个自定义属性name,并且赋值"数组"。然后进行遍历输出的,会发现新定义的属性也被for in输出来了,而for of并不会对name进行输出。

小结:

  • for in可以循环数组和对象,得到是数组的下标或对象的键名
  • for of只能循环数组,得到的是数组对应的值
### IPv4与IPv6报头结构对比及主要区别 #### 1. **版本字段** - IPv4IPv6都具有`版本`字段,用于标识协议的版本号。IPv4的版本字段值为4,而IPv6的版本字段值为6[^2]。 #### 2. **报头长度** - IPv4中存在`IHL(Internet Header Length)`字段,表示IPv4报头的长度,单位为32比特字。而在IPv6中取消了这一字段,IPv6报头固定为40字节[^2]。 #### 3. **服务质量字段** - IPv4中有`Type of Service (ToS)`字段,用于定义数据包的服务质量。在IPv6中,此字段被替换为`Traffic Class`,其功能类似于ToS,但提供了更多的灵活性以支持QoS需求[^2]。 #### 4. **总长度与有效载荷长度** - IPv4中的`Total Length`字段包含了整个数据包的长度(包括头部数据部分)。相比之下,IPv6引入了`Payload Length`字段,仅记录数据部分的长度而不包含头部长度[^2]。 #### 5. **标识符、标志位分片偏移** - 在IPv4中,`Identification`、`Flags`以及`Fragment Offset`字段共同作用于分片机制。然而,在IPv6设计中这些字段已被删除,取而代之的是通过扩展报头来处理分片操作。 #### 6. **生存时间与跳数限制** - IPv4使用`Time to Live (TTL)`字段防止数据包在网络中无限循环;IPv6则采用了`Hop Limit`字段替代TTL,二者功能相似,即限定数据包能够经过的最大路由器数量。 #### 7. **协议与下一头部** - IPv4中的`Protocol`字段指明传输层使用的协议类型(如TCP或UDP)。对于IPv6而言,则利用`Next Header`字段指示紧随其后的头部类型或者直接指向高层协议[^2]。 #### 8. **校验** - IPv4具备`Header Checksum`字段用作验证IP头部完整性。由于现代链路层协议通常提供错误检测能力,并且传输层已有相应校验措施,因此IPv6省略了这个字段[^2]。 #### 9. **地址字段** - `Source Address``Destination Address`这两个字段在两种协议间保持不变,分别存储源端目标端的IP地址信息[^2]。 #### 10. **可选字段与扩展报头** - IPv4允许存在多个`Options`字段作为附加特性配置项,位置位于基础报头之后。但在IPv6架构下,所有的额外选项都被整合进了专门设立的一系列扩展报头之中,从而简化了核心报头的设计并增强了系统的适应性效率[^2]。 #### 11. **新增加的流标签** - IPv6特别增设了一个名为`Flow Label`的新字段,旨在区分不同类型的流量以便实施更加精细的质量管理策略,比如给予实时视频通话更高的优先级处理权等[^3]。 --- ### 示例代码展示IPv6基本报头格式 以下是基于Python的一个简单函数模拟解析IPv6基本报头的过程: ```python def parse_ipv6_header(header_bytes): version_traffic_class_flow_label = int.from_bytes(header_bytes[:4], 'big') payload_length = int.from_bytes(header_bytes[4:6], 'big') next_header = header_bytes[6] hop_limit = header_bytes[7] source_address = ":".join([header_bytes[i:i+2].hex() for i in range(8, 24, 2)]) destination_address = ":".join([header_bytes[i:i+2].hex() for i in range(24, 40, 2)]) ipv6_header_info = { "Version": (version_traffic_class_flow_label >> 28), "TrafficClass": ((version_traffic_class_flow_label >> 20) & 0xFF), "FlowLabel": (version_traffic_class_flow_label & 0xFFFFF), "PayloadLength": payload_length, "NextHeader": next_header, "HopLimit": hop_limit, "SourceAddress": source_address, "DestinationAddress": destination_address } return ipv6_header_info ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值