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()  方法或 ObjecttoString()方法。循环将遍历对象本身的所有可枚举属性,以及对象从其构造函数原型中继承的属性(更接近原型链中对象的属性覆盖原型属性)。 

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...infor...of语句都迭代了某些东西。它们之间的主要区别在于它们的迭代。

for...in语句以任意顺序迭代对象的可枚举属性

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}

 

 

posted @ 2018-11-07 22:19  易怼怼的小迷妹  阅读(257)  评论(0编辑  收藏  举报