当前位置:首页 > 日记 > 正文

对Javascript中迭代器和循环的深入理解

对Javascript中迭代器和循环的深入理解
如何遍历数组元素20年前,Javascript出现时,您可能会这样做。

对于(VAR指标= 0;指数小于myarray.length;指数+ +){
console.log(MyArray {指数});
}

对于(VAR指标= 0;指数小于myarray.length;指数+ +){
console.log(MyArray {指数});
}
由于ES5,你可以使用内置的foreach方法:

Javascript
myarray.foreach(函数(值){)
console.log(价值);
});

myarray.foreach(函数(值){)
console.log(价值);
});
代码更精简,但有一个小缺点:不能使用中断语句跳出循环,不能使用返回语句从闭包函数返回它。

如果您有用于遍历数组的语法,它将更加方便。

那用在里面怎么样

对于(在MyArray VaR指标){ / /实际的代码不这样做
console.log(MyArray {指数});
}
对于(在MyArray VaR指标){ / /实际的代码不这样做
console.log(MyArray {指数});
}

这不太好,因为:

上面的代码中的索引变量将是一个字符串,如0。如果您使用字符串索引来参与某些操作(2121),操作结果可能不符合预期。

不仅对数组本身的元素将被通过,但附加(扩展)元素添加的用户也将走过。例如,如果数组有这样一个属性myarray.name,然后会有指数=名在一个周期。此外,即使是在阵列原型链属性可以穿越。

最令人难以置信的是,在某些情况下,上述代码将以任意顺序遍历数组元素。

简而言之,设计中的目的是遍历包含键值对的对象,而不是对数组非常友好。

周期性强

还记得我说最后一次,6不影响现有的js代码正常运行,已经有数以万计的Web应用程序的特点是依赖,甚至依靠在数组属性,所以没有人提出改进现有的语法来解决这个问题。6解决这个问题是引入一个新的循环遍历语法的唯一途径。

这是新语法:

对(对MyArray VaR值){
console.log(价值);
}

对(对MyArray VaR值){
console.log(价值);
}
通过在上面的语法中引入for,这个语法看起来并不那么令人印象深刻:

这是遍历数组的最简单直接的方式。
避免在for语法中存在的所有凹坑。
不像foreach(),它支持突破,继续,并返回语句。
内入是用来遍历对象的属性的。

用于遍历数据,就像数组中的元素一样。

然而,这并不是所有的特性,还有一个更好的部分。

支持的其他集合

因为不仅是设计的阵列,但也可以用于对象数组一样,如DOM对象的集合,NodeList。

它也可以用来遍历字符串,它被看作是一组Unicode字符:
它也适用于映射和设置对象。

也许你从未听说过的地图和设置对象,因为他们是在6的新对象,并将有一个单独的文章中详细介绍。如果您有其他语言的使用这两个对象,更容易。

例如,可以使用set对象对数组元素进行加权:

Javascript
从数组/单词中创建一个集合
无功uniquewords =新(字);

从数组/单词中创建一个集合
无功uniquewords =新(字);
当您得到一个set对象时,您可能会经历这个对象,这很简单:

对(对uniquewords变量的话){
console.log(字);
}

对(对uniquewords变量的话){
console.log(字);
}
map对象由键值对组成,具有稍微不同的遍历性,您需要接收具有两个独立变量的键和值。

对于(var { }的关键,价值phonebookmap){
console.log(键+的电话号码是:+价值);
}

对于(var { }的关键,价值phonebookmap){
console.log(键+的电话号码是:+价值);
}
到目前为止,您已经知道js已经支持了一些集合对象,稍后将支持更多。

不能直接用于遍历对象的属性。如果您想要遍历对象的属性,您可以在语句中使用(用于进行此操作),或者使用以下方式:

把一个对象的可枚举属性 /控制台
(object.keys VaR为的关键(someobject)){
console.log(键+:+ someobject {key});
}
把一个对象的可枚举属性 /控制台
(object.keys VaR为的关键(someobject)){
console.log(键+:+ someobject {key});
}

内部原理

好的艺术家复制,伟大的艺术家偷窃。-巴勃罗·鲁伊斯·毕加索

新的功能添加到6没有章。大多数特性已经用在其他语言中,事实证明这些特性非常有用。

采取的语句,例如,有C++,java类似的循环语句,C #和Python,并用来遍历各种数据结构在这种语言及其标准库。

比如,每个其他语言中的语句,对于需要遍历对象实现的具体方法。所有的数组,地图,并设置对象都有一个共同点,那就是,他们都实现一个迭代器(iterator)方法。

然后,只要您愿意,就可以为任何其他对象实现一个迭代器方法。

这就像你可以作为一个对象来实现myobject.tostring()方法,通知JS引擎如何将对象转换为字符串;也可以以任何对象实现一个MyObject { }()方法的象征。迭代器,通知JS引擎如何遍历对象。

例如,如果您使用jQuery,并且非常喜欢使用它的每个()方法,现在您希望所有jQuery对象支持语句,您可以这样做。

jQuery对象的数组如下,
给他们相同的迭代器方法
原型{符号.迭代器} =
数组;
jQuery对象的数组如下,
给他们相同的迭代器方法
原型{符号.迭代器} =
数组;

您可能会想,为什么{符号}语法看起来如此奇怪这个句子是什么意思问题的关键是方法名。ES标准委员会可以命名为迭代器()。但是,在现有的对象中可能有一种名为迭代器的方法,这将导致代码混乱并违反最大兼容性原则,因此标准委员会引入了符号,而不仅仅是字符串,作为方法名。

符号也是ES6新功能,和一个单独的文章将稍后推出。现在你只需要知道标准委员会已经提出了一个新的符号,如symbol.iterator,为了不与前面的代码冲突。唯一的缺点是,语法有点奇怪,但这个强大的新的功能和完善的向后兼容性,这是微不足道的。

与{符号对象。迭代器}()方法被认为是ergodicable(个)。在以后的文章中,我们将看到,遍历对象的概念贯穿于整个语言,不仅在语句,而且在构造器和解构功能的地图和设置,以及新的延拓算子。

迭代器对象

我们通常不会从头开始实现迭代器(迭代器)对象,下一篇文章将告诉您原因,但为了完整起见,让我们来看看迭代器对象是什么样的(如果跳过这个部分,您将错过一些技术细节)。

取语句的for,它首先通过遍历一个集合对象{符号}()方法调用,这个方法返回一个迭代器对象。迭代器对象是任何具有下一个方法的对象;然后,在每个循环中,将调用迭代器对象上的下一个方法:

无功zeroesforeveriterator = { {
{函数(){
返回此;
},
下一步:函数(){
返回{完成:false,值:0 };
}
};

无功zeroesforeveriterator = { {
{函数(){
返回此;
},
下一步:函数(){
返回{完成:false,值:0 };
}
};
在上面的代码中,每次调用下一个()方法时,它返回相同的结果。一方面,它告诉语句for循环遍历没有完成。另一方面,它告诉的声明周期的值是0,这意味着对(价值zeroesforeveriterator){ }是一个死循环。当然,一个典型的迭代器不会那么简单。

ES6迭代器遍历结果通过标识的每两个属性做and.value。这是迭代器的设计原则,这是不同于其他语言中的迭代器,java,迭代器对象使用两种方法,HasNext()和()。接下来,分别在Python,迭代器对象只有一个,下一个()的方法,和一个StopIteration异常时会有不可穿越的元素抛出。但从根本上说,这三个设计返回相同的信息。

迭代器对象也可以有选择地实现这两种方法。返回(),把(EXC)。如果由于异常或使用中断并返回运营商提前退出,则迭代器(返回)方法将被调用,返回()释放迭代器对象和资源的方法,但大多数的迭代器不需要实现这个方法。把(EXC)是一种特殊情况:这种方法不会在遍历过程中调用的,我将在下一篇文章中详细的方法。

既然我们知道了所有的细节,我们可以简单地重写语句。

第一个是循环体的for:

对于(VaR的迭代器){
声明
}

对于(VaR的迭代器){
声明
}
这只是一个语义实现,使用一些底层方法和几个临时变量:

VaR的迭代器迭代器美元= {符号。迭代器}();
VaR结果= iterator.next美元(美元);
而(!$结果(完成){
var = $ result.value;
声明
结果iterator.next美元(美元);
}
VaR的迭代器迭代器美元= {符号。迭代器}();
VaR结果= iterator.next美元(美元);
而(!$结果(完成){
var = $ result.value;
声明
结果iterator.next美元(美元);
}

上面的代码与如何调用返回()方法无关。我们可以添加相应的处理,但我认为这会影响我们对内部原理的理解,语句的使用非常简单,但是里面有很多细节。

兼容性

目前,Firefox的所有版本都已经支持了for语句,Chrome默认禁用该语句。你可以在地址栏输入铬: / /国旗,进入设置页面,然后检查实验Javascript选项。微软的浏览器也支持声明,但IE不支持它。如果你想在Web开发中使用该语句,你需要兼容IE和Safari浏览器,你可以使用巴别塔或眉目传情的traceur编译器变换ES6代码Web友好的ES5代码。

对于服务器端,我们不需要任何编译器。我们可以在io.js直接使用此语句,或使用启动选项时,Nodejs开始——和谐。

{已完成:真}

相关文章

如何隐藏Word2003文档记录格式的教

如何隐藏Word2003文档记录格式的教

教程,文档,格式,电脑软件,作为一个上班族,公司秘密的保护是最重要的。有时为了防止病毒和黑客的入侵,公司机密被盗。有时它是为了防止一些人,窥视秘密,等等,我们可以采取很多保护Word文档的内容被泄露的措施。 打开word文件按钮,您会发现您最近使…

CSS多列布局实现方法

CSS多列布局实现方法

多列,方法,布局,电脑软件,CSS,本文主要介绍了利用CSS实现多列布局的4种方法,这也是本项目中常用的方法。推荐给大家。 摘要: 在Web应用程序中经常看到多列布局,今天共享4的多列布局。 显示:表格 复制代码代码如下所示: {。表 宽度:自动; 最小宽…

PS使用蒙版国外景观后期修整

PS使用蒙版国外景观后期修整

后期,景观,国外,电脑软件,PS,作者非常谨慎。画面中的每一个细节都能完美地反映出来。因此,工作量也很大。我们必须不断地用遮罩控制色彩搭配区域,并描绘局部色彩和阴影。 作者非常谨慎。画面中的每一个细节都能完美地反映出来。因此,工作量也…

ps的合成,美丽的美人鱼

ps的合成,美丽的美人鱼

美丽,电脑软件,ps,你好,我是Gui Gui!这次我们带了一个合成美人鱼的例子,在这个教程中,我们要注意图层的排列顺序,掌握一些基本的颜色工具也是很重要的。 你好,我是Gui Gui!这次我们带了一个合成美人鱼的例子,在这个教程中,我们要注意图层的排列顺序…

如何使用Visio绘制网络拓扑

如何使用Visio绘制网络拓扑

网络拓扑,绘制,如何使用,电脑软件,Visio,如何使用Visio绘制网络拓扑网络拓扑主要用来反映整个网络设备、传输、节点的网络结构图,并有多种方式绘制网络拓扑图。接下来,萧边介绍你一个方法来绘制网络拓扑图,你可以参考它如果你需要朋友。 网络…

绿茶的拟物设计精巧的PS图象处理软

绿茶的拟物设计精巧的PS图象处理软

图标,精巧,图象,处理软件,电脑软件,总结过去的学习经验,我们建议你观察和思考整体和细节,并考虑如何做到这一点。如果你找到一个更好的方法去实现它,你可以试着去做,这样你就能提高你的效率。 总结过去的学习经验,我们建议你观察和思考,观察整体…

excel下拉菜单如何做excel窗体

excel下拉菜单如何做excel窗体

窗体,下拉菜单,如何做,电脑软件,excel,Excel创建了一个下拉菜单,有很多方法,这里分享的方法; 方法1: 1。示例:例如 2、pr值一般是1 ----- 10之间,我们进入Sheet2的A1 1 --- 10表,我们创建一个下拉菜单下PR值。 三.选择工作表中的下拉菜单的区域;选…

爱上你幸福快乐签名QQ签名个性

爱上你幸福快乐签名QQ签名个性

爱上你,幸福快乐,个性,电脑软件,QQ,我听说有人说,喜欢费里斯的人在等待快乐的人不记得他们什么时候开始的。费里斯车轮上有幸福的名字,华丽的肢体,慢节奏和爱人的心。这篇文章给你一个快乐的签名,我希望你喜欢它。 1,在夜晚,谁为我,一个绿色的光,谁…

QQ已经登录,没有任何关于如何处理常

QQ已经登录,没有任何关于如何处理常

提示,登录,没有任何,如何处理,常见,如果QQ出现在QQ2010 / 2011版本的使用,建议逐步删除以下三个文件夹。删除三个文件不会影响聊天记录,但可能设置会恢复到默认值。 1、数registry.db文件夹下 2、数info.db文件夹下 3、registry.db QQ号码文…

PS图象处理软件将增加水的美丽黑暗

PS图象处理软件将增加水的美丽黑暗

图象,处理软件,黑暗,美丽,红棕色,材料图片的主色是绿色的,颜色的时间直接到绿色到棕色,然后添加一些红棕色到深色可以通过初步获得。后来,添加一些高光的图片,然后添加一些冷色调增强。 材料图片的主要颜色是绿色,颜色的时间直接到绿色到棕色,然…

最新的23PS图象处理软件创意教程在

最新的23PS图象处理软件创意教程在

教程,创意,在国外,图象,处理软件,看看PS大师们在国外拍的照片。 PS教程帮助你提高你的工作技能。今天我们分享23个新的PS图象处理软件创意教程你。这些教程的步骤,详细介绍了技术创新设计,操作技能,和照片装饰的专家。这些教程,希望对提高你的P…

Javascript中的数组方法摘要

Javascript中的数组方法摘要

数组方法,摘要,电脑软件,Javascript,JS数组元素的添加和删除一直困惑不解。今天,我们终于找到了详细的信息。首先,给我代码来测试 VaR ARR =新的数组(); ARR { 0 } =AAA; ARR { 1 } =BBB; ARR { 2 } =CCC; / /警报(arr.length); / / 3 Arr.pop(); / /警…