for in、for of、for each in

1.for in:用于遍历数组或者对象的属性(对数组或者对象的属性进行循环操作),for ... in 循环中的代码每执行一次,就会对数组的元素或者对象的属性进行一次操作,for...in语句以任意顺序遍历一个对象的可枚举属性,对于每个不同的属性,语句都会被执行。

for (variable in object)
{
}

variable:在每次迭代时,将不同的属性名分配给变量;object:被迭代枚举其属性的对象。

一个for...in仅环比枚举,非符号属性迭代。对象从内置构造等生成ArrayObject继承来自非枚举的属性Object.prototypeString.prototype诸如String的indexOf()方法或object的toString()方法。循环将遍历对象本身的所有可枚举属性以及对象从其构造函数的原型继承的属性(更靠近原型链中对象的属性覆盖原型的属性)。

注意: for...in不应该用于迭代Array索引顺序很重要的位置。

数组索引只是具有整数名称的枚举属性,并且与通用对象属性相同。不能保证for ... in将以任何特定的顺序返回索引。for ... in循环语句将返回所有可枚举属性,包括非整数类型的名称和继承的那些。因为迭代的顺序是依赖于实现的,所以迭代数组可能不会以一致的顺序访问元素。因此,在迭代访问顺序很重要的数组时,最好使用for带有数字索引(或循环)Array.prototype.forEach()for...of循环。

for-in循环实际是为循环”enumerable“对象而设计的

 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
}

2.for of:创建了一个循环迭代迭代的对象(包括内置的StringArray例如该Array式的argumentsNodeList对象,TypedArrayMapSet,和用户定义的iterables),调用的自定义迭代钩与语句来为每个不同的属性的值执行对象。

for (variable of iterable)
{
statement
}

variable:在每次迭代时,将不同属性的值分配给变量;iterable:迭代其可迭代属性的对象。

(1)循环一个数组(Array):

 let iterable = [10, 20, 30];

 for (let value of iterable) {
console.log(value);
}
//
//
//

我们可以使用const来替代let,这样它就变成了在循环里的不可修改的静态变量。

 let iterable = [10, 20, 30];

 for (const value of iterable) {
console.log(value);
}
//
//
//

(2)循环一个字符串:

let iterable = "boo";

for (let value of iterable) {
console.log(value);
}
// "b"
// "o"
// "o"

(3)循环一个类型化的数组(TypedArray):

let iterable = new Uint8Array([0x00, 0xff]);

for (let value of iterable) {
console.log(value);
}
//
//

(4)循环一个Map:

let iterable = new Map([["a", 1], ["b", 2], ["c", 3]]);

for (let [key, value] of iterable) {
console.log(value);
}
//
//
// for (let entry of iterable) {
console.log(entry);
}
// [a, 1]
// [b, 2]
// [c, 3]

(5)循环一个 Set:

let iterable = new Set([1, 1, 2, 2, 3, 3]);

for (let value of iterable) {
console.log(value);
}
//
//
//

(6)循环一个 DOM collection

// Note: This will only work in platforms that have
// implemented NodeList.prototype[Symbol.iterator]
let articleParagraphs = document.querySelectorAll("article > p"); for (let paragraph of articleParagraphs) {
paragraph.classList.add("read");
}

(7)循环一个拥有enumerable属性的对象

for–of循环并不能直接使用在普通的对象上,但如果我们按对象所拥有的属性进行循环,可使用内置的Object.keys()方法:

for (var key of Object.keys(someObject)) {
console.log(key + ": " + someObject[key]);
}

(8)循环一个生成器(generators)

function* fibonacci() { // a generator function
let [prev, curr] = [0, 1];
while (true) {
[prev, curr] = [curr, prev + curr];
yield curr;
}
} for (let n of fibonacci()) {
console.log(n);
// truncate the sequence at 1000
if (n >= 1000) {
break;
}
}

3.for each in: 该语句在对象属性的所有值上迭代指定的变量。对于每个不同的属性,执行指定的语句。

for each (variable in object) {
statement
}
variable:变量以迭代属性值,可选地使用var关键字声明。该变量是函数的本地变量,而不是循环。object:迭代属性的对象。
statement:要为每个属性执行的语句。要在循环中执行多个语句,请使用block语句({ ... })对这些语句进行分组。

警告:永远不要在数组上使用这样的循环。仅在物体上使用它。以下代码段迭代对象的属性,计算它们的总和:

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

JS之Iterations的更多相关文章

  1. (翻译)《Hands-on Node.js》—— Why?

    事出有因 为何选择event loop? Event Loop是一种推进无阻塞I/O(网络.文件或跨进程通讯)的软件模式.传统的阻塞编程也是用一样的方式,通过function来调用I/O.但进程会在该 ...

  2. JS学习笔记12_优化

    一.可维护性优化 1.添加注释 注释能够增强代码的可读性以及可维护性,当然,理想情况是满满的注释,但这不太现实.所以我们只需要在一些关键的地方添上注释: 函数和方法:尤其是返回值,因为直接看不出来 大 ...

  3. ios9下ionic框架报[$rootScope:infdig] 10 $digest() iterations reached. Aborting!的解决办法

    升级ios9后,ionic开发的app会报[$rootScope:infdig] 10 $digest() iterations reached. Aborting!的错误,加上一个patch就可以解 ...

  4. 通过JS将BSAE64生成图片并下载

    HTML:<div style="display:block;margin:0 auto;width:638px;height:795px;"><div id=& ...

  5. Web Animations API (JS动画利器)

    原文地址:→传送门 写在前面 之前学习了CSS animation/setTimeout/setInterval/requestAnimationFrame等,这些都可以用在某种场景下的小动画,也可以 ...

  6. Node.js 加密

    稳定性: 2 - 不稳定; 正在讨论未来版本的 API 改进,会尽量减少重大变化.详见后文. 使用 require('crypto') 来访问这个模块. 加密模块提供了 HTTP 或 HTTPS 连接 ...

  7. You Don't Know JS: Async & Performance(第3章, Promises)(未看)

    Chapter 3: Promises But what if we could uninvert that inversion of control? What if instead of hand ...

  8. C#/JS AES字符串加密和解密

    往往我们有一种需求:在页面端实现对即将传入到后台端的某些字符串进行加密,然后在后台端对传入进来的字符串做解密.在一些有安全要求的数据传输上会用到此种方式 下面分别列出js端和后台端的加密或解密代码. ...

  9. AES加解密JS和php互相处理字符

    Reference: http://blog.csdn.net/carlos__z/article/details/53185082 JavaScript code? 1 2 3 4 5 6 7 8 ...

随机推荐

  1. html中使用JS实现图片轮播效果

    1.首先是效果图,要在网页中实现下图的轮播效果,有四张图片,每张图片有自己的标题,然后还有右下角的小方框,鼠标悬浮在小方框上,会切换到对应的图片中去. 2.先是HTML中的内容,最外层是轮播图整个的容 ...

  2. SQL Server批量数据导出导入BCP&Bulk使用

    数据导出导入,首先考虑使用什么技术实现导出与导入利用BCP结合Bulk技术实现数据的导出与导入 1.bcp数据导出(这里是命令行方式),导出的数据需是格式化的,有两种方式可选 a.对传输的数据格式要求 ...

  3. Flex 布局:实例篇

    上一篇文章介绍了Flex布局的语法,今天介绍常见布局的Flex写法.你会看到,不管是什么布局,Flex往往都可以几行命令搞定. ​ 我只列出代码,详细的语法解释请查阅<Flex布局教程:语法篇& ...

  4. 【Python+Selenium】猪猪练习成功版:csv文件的输入和输出(运行环境:python3.5版本)

    自己实践成功的从csv文件中读取用户名密码并实际登录系统后判断是否登录成功,并将已经运行的用户名密码及运行结果输出到一个新的csv文件中~ # coding=utf-8 from selenium i ...

  5. unittest框架(二)单元测试及测试报告

    如果要自测代码,可使用单元测试,需要导入unittest模块,import unittest即可. 例如,自测一个计算连个数相除的函数,代码如下: import unittest def calc(a ...

  6. mydumper安装

    安装依赖包: yum install glib2-devel mysql-devel zlib-devel pcre-devel openssl-devel cmake 下载二进制包: wget ht ...

  7. 使用jQuery包装节点

    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...

  8. Python:笔记(7)——yield关键字

    Python:笔记(7)——yield关键字 yield与生成器 所谓生成器是一个函数,它可以生成一个值的序列,以便在迭代中使用.函数使用yield关键字可以定义生成器对象. 一个例子 我们调用该函数 ...

  9. CCF地铁修建

    问题描述 A市有n个交通枢纽,其中1号和n号非常重要,为了加强运输能力,A市决定在1号到n号枢纽间修建一条地铁. 地铁由很多段隧道组成,每段隧道连接两个交通枢纽.经过勘探,有m段隧道作为候选,两个交通 ...

  10. uva473

     Raucous Rockers  You just inherited the rights to n previously unreleased songs recorded by the pop ...