首页 > 其他分享 >JS 中 for in 和 for of 的区别

JS 中 for in 和 for of 的区别

时间:2023-05-28 16:56:03浏览次数:39  
标签:Eula obj 区别 Umbra JS 遍历 arr1 prototype

记忆方法

for in : ES5先出,index,遍历索引,适合对象

for of : ES6后出,遍历属性,适合数组

 

for in 和 for of 是js中常用的遍历方法;两者的区别如下:

一,遍历数组

1,for in 是ES5的语法标准,而for of则是ES6语法标准。

const arr1 = ['Eula', 'Umbra', 'Kaya']
for(let i in arr1){
    console.log(i)  // '0', '1', '2'
}
// 对比
for(let i of arr1){
    console.log(i) // Eula, Umbra, Kaya
}

通过上述代码我们可以发现for in遍历的是下标,而for of遍历的是属性值;而且for in所遍历的下标是Strign类型而不是Number类型;

 

2,for in 遍历时可以遍历到当前数组的所有属性名和方法名。也能拿到原型链上定义的属性名和方法。如下代码:

const arr1 = ['Eula', 'Umbra', 'Kaya'];

//下面两种在原型上添加属性的效果是一样的
Array.prototype.UmbraName = '安柏';
arr1.__proto__.constructor.prototype.EulaName = '尤菈';
arr1.__proto__.constructor.prototype.sayHello = function () {
  return 'hello';
};
for (let i in arr1) {
  console.log(i + ':' + arr1[i]);
}

打印结果:
0:Eula
1:Umbra
2:Kaya
UmbraName:安柏
EulaName:尤菈
sayHello:function () {
  return 'hello';
}

而使用for of遍历时则不会遍历原型链上的属性和方法;代码如下:

const arr1 = ['Eula', 'Umbra', 'Kaya'];

//下面两种在原型上添加属性的效果是一样的
Array.prototype.UmbraName = '安柏';
arr1.__proto__.constructor.prototype.EulaName = '尤菈-劳伦斯';
arr1.__proto__.constructor.prototype.sayHello = function () {
  return 'hello';
};
for (let i of arr1) {
  console.log(i);
}
打印结果:
Eula
Umbra
Kaya

 

二,遍历对象

1, for in本来就是用来遍历对象的,这没什么问题,需要注意的是它也会遍历出原型链上面的属性和方法;如果不想遍历原型链上面的属性可以配合使用obj.hasOwnProperty(prop)方法;

const obj = {
  name: 'Eula',
  friend: 'Umbra',
  age: 18,
};
obj.__proto__.constructor.prototype.EulaName = '尤菈-劳伦斯';
Object.prototype.UmbraName = '安柏';
for (let key in obj) {
  console.log(key + ':' + obj[key]);
}
打印结果:
name:Eula
friend:Umbra
age:18
EulaName:尤菈-劳伦斯
UmbraName:安柏

而使用 for of 遍历对象时则会报错:TypeError: 'x' is not iterable;MDN上截图如下:

这是为什么呢?

 

这是因为能够被for of正常遍历的数据类型都需要实现一个遍历器Iterator。

而数组、字符串、Set、Map结构,早就内置好了Iterator(迭代器),它们的原型中都有一个Symbol.iterator方法,而Object对象并没有实现这个接口,使得它无法被for of遍历。

 

如果想要 for of 遍历对象,做为替代你必须使用 Object.keys来配合:

const obj = {
  name: 'Eula',
  friend: 'Umbra',
  age: 18,
};

for (let key of Object.keys(obj)) {
  console.log(key + ':' + obj[key]);
}
成功遍历:
name:Eula
friend:Umbra
age:18

 

三,总结

for in适合遍历对象,for of适合遍历数组。for in遍历的是数组的索引,对象的属性,以及原型链上的属性。
for of除了能够遍历真数组、字符串、ES6的Set、Map集合还能遍历伪数组(NodeList);

 

标签:Eula,obj,区别,Umbra,JS,遍历,arr1,prototype
From: https://www.cnblogs.com/miangao/p/17438480.html

相关文章

  • 无法在web.xml或使用此应用程序部署的jar文件中解析绝对uri:[http://java.sun.com/jsp/
     第一个错误 刷新后出现第二个 org.apache.jasper.JasperException: java.lang.ClassNotFoundException: org.apache.jsp.admin.adminFace_jsp 解决方法:1.1检查WEB-INF下的lib文件夹里是否导入了写jstl-1.2.jar(jstl.jar),standard1.1.jar(standard.jar)如果没有......
  • wait()和sleep()的区别
    (1)wait()方法是object类的方法,sleep是Thread类的静态方法。(2)wait()方法需要和锁搭配使用,线程调用wait()方法会释放锁,而sleep()方法不需要和锁搭配使用,线程调用sleep()方法不会释放锁。(3)线程调用wait()方法需要其它线程调用notify()或者notifyAll()方法唤醒线程,而线程调用sleep()方法到了一定时间会......
  • FastJson
          ......
  • babylon.js 学习笔记(6)
    接上回继续,今天继续捣腾动画,上一节咱们让汽车的轮子动了起来,回顾一下核心代码://轮子转动constwheelAnimation=(scene,wheels)=>{//定义一个动画,每秒30帧,绕y轴转动constanimWheel=newBABYLON.Animation("wheelAnimation","rotation.y",30,BABYLO......
  • 可视化库D3.js
    什么是D3.jsD3指的是Data-DrivenDocuments,js即Javascript,是后缀名。先看看官网上对D3.js库的定义:D3.js是基于数据驱动文档工作方式的一款JavaScript函数库,主要用于网页作图、生成互动图形,是最流行的可视化库之一。D3使你有能力借助HTML,SVG和CSS来生动地可视化各种数据**D3不......
  • 金额处理currency.js
    <template><div><el-buttontype="primary"@click="test">按钮</el-button><p></p></div></template><script>importcurrencyfrom'currency.js'expo......
  • js 原型链
            ......
  • java中throw和throws的区别
    在Java中,throw和throws是两个关键字,用于处理异常。throw用于在程序中手动抛出一个异常。它用于指示程序中的某个错误状态,并将异常抛回到相应的调用栈。例如:if(user==null){thrownewIllegalArgumentException("Usercannotbenull.");}在上述代码中,如果用户为空,则手动......
  • 成员变量和局部变量的区别
    packagecom.variable;publicclassTest{//成员变量和局部变量的区别//1.类中的位置不同:成员变量(类中,方法外)、局部变量(常见于方法中)//2.初始化值不同:成员变量(有默认值,不需要初始化赋值)、局部变量(没有默认值,使用之前必须完成赋值)//3.内存位置不同:成员变量(存在于堆内存)、局......
  • Wimlib-imagex 1.14.1和ImageX Tool for Windows Version: 10.0.10011.16384是两款不
    Wimlib-imagex1.14.1和ImageXToolforWindowsVersion:10.0.10011.16384是两款不同的Windows镜像工具,它们之间存在一些区别。开发者不同:Wimlib-imagex是由OpenSourceCommunity开发的自由开源软件,而ImageXToolforWindows是Microsoft开发的商业软件。编写语言不同:Wi......