这段时间用到这两个语句的场景比较少了,以前项目中用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
}