无论是for…in还是for…of语句都是迭代一些东西。它们之间的主要区别在于它们的迭代方式。
1.for…in 语句以原始插入顺序迭代对象的可枚举属性。
2.for…of 语句遍历可迭代对象定义要迭代的数据(不包括从父类对象中继承的属性)。
以下示例显示了与Array一起使用时,for…of循环和for…in循环之间的区别。
//定义Object对象属性objCustom
Object.prototype.objCustom = function() {};
//定义Array对象属性arrCustom Array.prototype.arrCustom = function() {}; let iterable = [3, 5, 7]; iterable.foo = 'hello'; //for in 会继承 for (let i in iterable) { console.log(i); // logs 0, 1, 2, "foo", "arrCustom", "objCustom" } for (let i in iterable) { if (iterable.hasOwnProperty(i)) { console.log(i); // logs 0, 1, 2, "foo" } } // for of for (let i of iterable) { console.log(i); // logs 3, 5, 7 }
每个对象将继承objCustom属性,并且作为Array的每个对象将继承arrCustom属性,
因为将这些属性添加到Object.prototype和Array.prototype。
由于继承和原型链,对象iterable继承属性objCustom和arrCustom。
for in
for (let i in iterable) { console.log(i); // logs 0, 1, 2, "foo", "arrCustom", "objCustom" }
此循环仅以原始插入顺序记录iterable 对象的可枚举属性。它不记录数组元素3, 5, 7 或hello,因为这些不是枚举属性。但是它记录了数组索引以及arrCustom和objCustom。如果你不知道为什么这些属性被迭代,array iteration and for…in中有更多解释。
for (let i in iterable) { if (iterable.hasOwnProperty(i)) { console.log(i); // logs 0, 1, 2, "foo" } }
这个循环类似于第一个,但是它使用hasOwnProperty() 来检查,如果找到的枚举属性是对象自己的(不是继承的)。如果是,该属性被记录。记录的属性是0, 1, 2和foo,因为它们是自身的属性(不是继承的)。属性arrCustom和objCustom不会被记录,因为它们是继承的。
for...in
不应该用于迭代一个 Array
,其中索引顺序很重要。
for of
for (let i of iterable) { console.log(i); // logs 3, 5, 7 }
该循环迭代并记录iterable作为可迭代对象定义的迭代值,这些是数组元素 3, 5, 7,而不是任何对象的属性。
forEach
forEach是ES5数组中引入的一个方法(Array.prototype.forEach()),用于数组的遍历。
var array1 = ['a', 'b', 'c']; array1.forEach(function(value,index,array) { console.log(value,index,array); }); //> "a" 0 Array ["a", "b", "c"] //> "b" 1 Array ["a", "b", "c"] //> "c" 2 Array ["a", "b", "c"]
语法:
arr.forEach(callback[, thisArg]);
参数
callback
- 为数组中每个元素执行的函数,该函数接收三个参数:
currentValue
- 数组中正在处理的当前元素。
-
index
可选 - 数组中正在处理的当前元素的索引。
-
array
可选 -
forEach()
方法正在操作的数组。
-
thisArg
可选 - 可选参数。当执行回调函数时用作
this
的值(参考对象)。
---------------------
作者:相濡以沫丶
来源:CSDN
原文:https://blog.csdn.net/qq_32279193/article/details/78685366
版权声明:本文为博主原创文章,转载请附上博文链接!