for each...in
使用一个变量迭代一个对象的所有属性值,对于每一个属性值,有一个指定的语句块被执行。
一些对象的内置属性是无法被遍历到的,包括所有的内置方法,例如String对象的indexOf方法。不过大部分的用户自定义属性都是可遍历的。
【警告:永远不要使用 for each...in语句遍历数组,仅用来遍历常规对象。(有可能会对数组顺序发生改变)】
语法:
for each (variable in object) {
statement
}
参数:
variable
用来遍历属性值的变量,前面的var关键字是可选的。该变量是函数的局部变量而不是语句块的局部变量。
object
该对象的属性值会被遍历。
statement
遍历属性值时执行的语句。 如果想要执行多条语句, 请用({ ... }) 将多条语句括住。
eg:
var sum = 0;
var obj = {prop1: 5, prop2: 13, prop3: 8};
for each (var item in obj) {
sum += item;
}
console.log(sum);
// output:logs "26", which is 5+13+8
for...in
以任意顺序遍历一个对象的可枚举属性。对于每个不同的属性,语句都会被执行。
for...in 循环只遍历可枚举属性。
像 Array和 Object使用内置构造函数所创建的对象都会继承自Object.prototype和String.prototype的不可枚举属性。
语法:
for (variable in object) {...}
参数:
variable
在每次迭代时,将不同的属性名分配给变量。
object
被迭代枚举其属性的对象。
eg:
var obj = {a: 1, b: 2, c: 3};
for (const prop in obj) {
console.log(`obj.${prop} = ${obj[prop]}`);
}
// Output:
// "obj.a = 1"
// "obj.b = 2"
// "obj.c = 3"
for...of
在可迭代对象(包括 Array,Map,Set,String,TypedArray,arguments 对象等等)上创建一个迭代循环,调用自定义迭代例子,并为每个不同属性的值执行语句。
对于for...of的循环,可以由break, throw 或return终止。
语法:
for (variable of iterable) {
//statements
}
参数:
variable
在每次迭代中,将不同属性的值分配给变量。
iterable
被迭代枚举其属性的对象。
eg:
let iterable = [10, 20, 30];
for (let value of iterable) {
value += 1;
console.log(value);
}
// 11
// 21
// 31
-------------------------------------------------------------------------------------------------------------------------------
关于 for...in 和 for...of 之间的区别:
无论是for...in还是for...of语句都是迭代一些东西。它们之间的主要区别在于它们的迭代方式。
for...in 语句以原始插入顺序迭代对象的可枚举属性。
for...of 语句遍历可迭代对象定义要迭代的数据。