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