
对于(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开始——和谐。
{已完成:真}