for in 和 for of的区别
-
for of
描述:
for...of语句在可迭代对象(包括Array,Map,Set,String,TypedArray,arguments 对象等等)上创建一个迭代循环,调用自定义迭代钩子,并为每个不同属性的值执行语句for of是ES6新出的一个用于遍历可迭代对象(实现了
Iterator接口)的语法 -
for (variable of iterable) { //statements } //variable 每次迭代将不同的属性值分配给变量 // iterable 被迭代枚举其属性对象//array let iterable = [10, 20, 30]; for (let value of iterable) { value += 1; console.log(value); } // // 输出 11 21 31 //string let iterable = "boo"; for (let value of iterable) { console.log(value); } // b 0 0 map set arguments ... -
forin
for...in语句以任意顺序迭代一个对象的除Symbol以外的可枚举属性,包括继承的可枚举属性。for (variable in object) statement //variable 每次迭代会被赋值为不同的属性名 object 非symbol类型的可枚举属性被迭代的对象 Object.prototype.objCustom = function() {}; Array.prototype.arrCustom = function() {}; let iterable = [3, 5, 7]; iterable.foo = 'hello'; // 会遍历原型链上的属性 for (let i in iterable) { console.log(i); // logs 0, 1, 2, "foo", "arrCustom", "objCustom" } for (let i in iterable) { //hasOwnProperty 只判断对象自身属性,忽略从原型连上继承的属性 //如果检测的属性值是null和undefined ,依旧会返回true if (iterable.hasOwnProperty(i)) { console.log(i); // logs 0, 1, 2, "foo" } } // of不会遍历原型链上的属性 for (let i of iterable) { console.log(i); // logs 3, 5, 7 }
注意:
1.for in 应该用于迭代一个关注索引顺序的Array
2.如果你只要考虑对象本身的属性,而不是它的原型,那么使用 getOwnPropertyNames() 或执行 hasOwnProperty() 来确定某属性是否是对象本身的属性(也能使用propertyIsEnumerable)。或者,如果你知道不会有任何外部代码干扰,您可以使用检查方法扩展内置原型。
- 它是为了遍历对象而构建的,不建议与数组一起使用
- 可枚举对象属性是内部 ***可枚举标志位true***的属性
- or in循环只会对对象中的可枚举属性进行遍历,并且跳过属性名是Symbol类型的属性
- for in只会遍历对象本身上面的可枚举属性
主要的区别:
- for in 语句以任意顺序迭代对象的可枚举属性, 并且遍历非Symbol 类型键以及对象自身可枚举的属性
2.for of 适用于实现了Iterator接口的对 象(也称作可迭代对象)的遍历其遍历方式由自身实现,对于数组是遍历其下标值,对于Map遍历值为键值对组成的数组