for...each...in;for...in;for...of;

for each...in

for each...in 陈述在对象属性值的所有值上迭代指定的变量。对于每个不同的属性,将执行指定的语句。
句法
for each (variable in object) {
  statement
}
variable
变量对属性值进行迭代,可以使用var关键词。此变量是函数的本地变量,而不是循环的本地变量。
object
对象,该对象的属性是迭代的。
statement
为每个属性执行的语句。若要在循环中执行多个语句,请使用块声明({ ... })将这些声明分组。

描述
一些内置属性不被迭代。这些包括所有内置的对象方法,例如。String氏indexOf方法。但是,所有用户定义的属性都会被迭代。


for...in

for...in陈述遍历所有非-符号, 可枚举属性一个物体的。
句法
for (variable in object) { ...
}
variable
一个不同的属性名被分配给变量每次迭代。
object
对象,其非符号可枚举属性被迭代。

描述
A for...in循环只对可枚举的非符号属性进行迭代。从内置构造函数创建的对象,如Array和Object继承不可枚举属性。
Object.prototype和String.prototype,如String氏indexOf()方法或Object氏toString()方法。
循环将迭代对象本身的所有可枚举属性以及对象从构造函数的原型继承的属性(Prototype链中更接近对象的属性覆盖原型的属性)。

删除、添加或修改属性
A for...in循环以任意顺序迭代对象的属性(请参阅delete操作符,以了解为什么不能依赖于似乎有序的迭代,至少在跨浏览器设置中是这样的)。

如果一个属性在一次迭代中被修改,然后在以后的某个时间被访问,那么它在循环中的值就是它在以后的时间的值。在访问之前删除的属性将不会在以后访问。添加到正在进行迭代的对象中的属性可以被访问,也可以从迭代中省略。

通常,在迭代期间最好不要从对象中添加、修改或删除属性,而不是当前正在访问的属性。不能保证是否会访问添加的属性,
修改后的属性(当前的属性除外)是否会在修改之前或之后访问,或者删除之前是否会访问已删除的属性。

数组迭代和.
注: for...in不应用于迭代Array索引顺序很重要的地方。

数组索引只是具有整数名的可枚举属性,在其他方面与一般对象属性相同。不能保证for...in将以任何特定顺序返回索引。
for...in循环语句将返回所有可枚举属性,包括具有非整数名的属性和继承的属性。

因为迭代的顺序依赖于实现,所以迭代数组可能不会以一致的顺序访问元素。
因此,最好使用for使用数字索引(或Array.prototype.forEach()或者for...of循环)在访问顺序重要的数组上迭代时。

只迭代自己的属性
如果只想考虑附加到对象本身的属性,而不是它的原型,请使用getOwnPropertyNames()或执行hasOwnProperty()
核对(propertyIsEnumerable也可以使用)。或者,如果您知道不会有任何外部代码干扰,您可以使用检查方法扩展内置原型。

for...of

for...of陈述创建循环遍历可迭代对象,包括:内置String, Array, Array-类似物体(例如,arguments或NodeList), TypedArray, Map, Set,
以及用户定义的可迭代性。它调用自定义迭代钩子,并为对象的每个不同属性的值执行语句。

句法
for (variable of iterable) {
  statement
}
variable
在每次迭代中,都会将不同属性值分配给变量.
iterable
对象,其可迭代属性被迭代。

差异for...of和for...in

双管齐下for...in和for...of语句迭代某物。它们之间的主要区别在于它们迭代的内容。

for...in语句遍历可枚举属性以任意顺序排列的物体。
for...of语句对以下数据进行迭代:可迭代对象定义要被迭代。

猜你喜欢

转载自www.cnblogs.com/azurite/p/9943914.html
今日推荐