for each in&for in&for of
For ......... each in
for each是jdk5.0新增加的一个循环结构,可以用来以此处理数组中的每个元素(其他类型的元素集合也可以)而不用为指定下标而分心。它是一个类似但已弃用的语句,它迭代对象属性的值,而不是属性名称本身
格式如下:
for(variable:collection)
{
Statement
} (“:”等于“in”)
即for each (variable in object) {
statement
}
参数:
Variable:
变量以迭代属性值,可选择使用var关键字声明。该变量是函数的局部变量而不是语句块的局部变量.
Object:
迭代属性的对象。该对象的属性值会被遍历.
Statement:
遍历属性值时执行的语句。如果要在循环中执行多个语句,请使用({ ... })对这些语句进行分组。
警告:永远不要使用for each...in语句遍历数组,仅用来遍历常规对象
var sum
= 0;var obj = {prop1: 5, prop2: 13, prop3: 8};
for each (var item in obj) {
sum += item;}
console.log(sum); // logs "26", which is 5+13+8
let arr = ['a', 'b', 'c', 'd']
arr.forEach(function (val, idx, arr) {
console.log(val + ', index = ' + idx) // val是当前元素,index当前元素索引,arr数组
console.log(arr)
})
输出结果:
a, index = 0
(4) ["a", "b", "c", "d"]
b, index = 1
(4) ["a", "b", "c", "d"]
c, index = 2
(4) ["a", "b", "c", "d"]
d, index = 3
(4) ["a", "b", "c", "d"]
写法简单了很多,但是也存在一个局限 就是你不能中断循环(使用break语句或使用return语句)。
---------------------
作者:一个慢
来源:CSDN
原文:https://blog.csdn.net/one_girl/article/details/80192899
For ......... in
For in语句是JDK5版本的新特性,在此之前,遍历数组或集合的方法有两种:通过下标遍历和通过迭代器遍历。
JDK5以后引入了forin语句,目的是为了简化迭代器遍历,其本质仍然是迭代器遍历。forin语句的写法很简单:
格式:
for (variable in object) { ...
}
Variable:
每次迭代都会为变量分配不同的属性名称。
Object:
迭代可枚举属性的对象。
for(数据类型 对象名:数组或集合名){
................
}
这里的数据类型是数组或集合中的数据类型,接着声明一个该数据类型的对象,用于代替数组或集合中的每一个元素(因此for in语句又称为for each语句),最后便是对该对象也就是数组或集合中元素的操作了。
for...in 循环只遍历可枚举属性。像 Array和 Object使用内置构造函数所创建的对象都会继承自Object.prototype和String.prototype的不可枚举属性,例如 String 的 indexOf() 方法或 Object的toString()方法。循环将遍历对象本身的所有可枚举属性,以及对象从其构造函数原型中继承的属性(更接近原型链中对象的属性覆盖原型属性)。
for...in以任意顺序循环迭代的对象的属性
如果在一次迭代中修改属性,然后在稍后访问该属性,则其在循环中的值是其稍后的值。在访问之前删除的属性将不会在以后访问。添加到正在进行迭代的对象的属性可以在迭代中被访问或省略。通常,除了当前正在访问的属性之外,最好不要在迭代期间添加,修改或删除对象的属性。无法保证是否会访问添加的属性,是否在修改之前或之后访问已修改的属性(当前的属性除外),或者删除之前是否将访问已删除的属性。
注意: for...in不应该用于迭代数组下标顺序很重要的位置。
数组索引只是具有整数名称的可枚举属性,并且与一般对象属性相同。无法保证for...in以任何特定顺序返回索引。该for...in循环语句将返回所有枚举的属性,包括那些非整数的名字和那些继承。
因为迭代的顺序是依赖于实现的,所以迭代数组可能不会以一致的顺序访问元素。因此,在迭代访问顺序很重要的数组时,最好使用for带有数字索引(或循环)Array.prototype.forEach()的for...of循环。
它仅对自己的属性进行迭代
如果您只想考虑附加到对象本身的属性,而不是其原型,请使用getOwnPropertyNames()或执行hasOwnProperty()检查(propertyIsEnumerable也可以使用)。或者,如果您知道不会有任何外部代码干扰,您可以使用check方法扩展内置原型。
例子:
以下函数将对象作为其参数。然后,它遍历所有对象的可枚举非Symbol属性,并返回属性名称及其值的字符串。
var obj = { a : 1 , b : 2 , c : 3 } ;
for (const prop in obj ) {
console 。log (`obj。$ { prop } = $ { obj [ prop ] } `); }
//输出://“obj.a = 1” //“obj.b = 2” //“obj.c = 3”
let obj = {a: '1', b: '2', c: '3', d: '4'}
for (let o in obj) {
console.log(o) //遍历的实际上是对象的属性名称 a,b,c,d
console.log(obj[o]) //这个才是属性对应的值1,2,3,4 }
For ...............of(一个迭代属性值的类似语句)
格式:
for (variable of iterable) {
statement}
参数:
variable
在每次迭代时,将不同属性的值分配给变量。
object
迭代其可迭代属性的对象。
例子:
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...of语句迭代可迭代对象定义为迭代的数据。
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) {
if (iterable.hasOwnProperty(i)) {
console.log(i); // logs 0, 1, 2, "foo"
}}
for (let i of iterable) {
console.log(i); // logs 3, 5, 7}