js中的for in和for of有什么区别?

原创 野人  2022-01-06 22:55  阅读 132 次

这段时间用到这两个语句的场景比较少了,以前项目中用vue的使用,那真的是家常便饭了,因为vue中的循环用的跟for in比较像,不过人家的写法,肯定是要有个独特的风格,来区别这是vue专属的用法哦,当然了,这不是本文的重点,今天要讲的是js中的for ifor of有什么区别?

相同点

都可以用来遍历数组/对象,其他的不太清楚,有大佬知道的话,欢迎来补充哈。

不同点

for i遍历的是数组的索引(index),且会遍历数组所有的可枚举属性(特殊点①),包括原型上的属性,如果不想遍历原型方法和属性的话,可以在遍历的时候使用hasOwnProperty()方法来判断下该属性是不是属于该对象上的属性,大多数情况下for i都是用来遍历对象的,如果用来遍历数组的话获取的索引值不一定正确会跳过空位的索引(特殊点②),22.3.13补充遍历出来的索引是字符串,无法进行几何运算(特殊点③),具体有如下代码测试案例:

let object = {
  a: 1,
};
Object.prototype.b = 2;
for (const key in object) {
  console.log(key); //a,b 特殊点①会把原型链上的属性也遍历出来
  console.log(typeof key);//string 特殊点③ 
  if (object.hasOwnProperty(key)) {
    console.log(key); //a
  }
}

let arr=[1,,3,4];
for (const key in arr) {
    console.log(key);//0,2,3,b 特殊点②当数组里面有一项为empty的话,索引就出问题了
// 22.3.13 更新,之前这块的描述有问题,是会跳过空位,不是获取的索引出错。
// ES5 对空位的处理,具体可看http://www.zuo11.com/blog/2020/1/js_array.html
// forEach(), filter(), reduce(), every() 和some()都会跳过空位
// map()会跳过空位,但会保留这个值
// join()和toString()会将空位视为undefined,而undefined和null会被处理成空字符串
// ES6 则是明确将空位转为undefined,比如 entries()、keys()、values()方法
}

for of遍历的是数组元素值(value),适用遍历数/数组对象/字符串/map/set等拥有迭代器对象(iterator)的集合,但是不能用于遍历对象(所以网上常看到一句话的for i常用遍历对象,而for of常用遍历数组的由来吗?)

let arr=[1,2,3];
for (const key of arr) {
    console.log(key);//1,2,3
}

参考资料

for in 和 for of 的区别

本文地址:https://www.yerenwz.com/5512.html
版权声明:本文为原创文章,版权归 野人 所有,欢迎分享本文,转载请保留出处!

发表评论