我很震惊,我找不到答案(也许没有答案)。假设我想迭代一次数组。我不必创建一个迭代的变量,但似乎这就是我必须要做的。理想情况下,我可以做这样的事情:
for (key, val in 'one two three'.split(' ')) {
console.log(val);
}
但是,您似乎只能从javascript的for..in
语法中获取键。有没有办法迭代该数组而不先将其存储到变量?
答案 0 :(得分:10)
大约一半的网络冲浪者(在撰写本文时,数字一直在上升)使用本机支持ECMAScript5的浏览器(例如,第5版),其中包含一些新的构造,包括{{3 }}:
"one two three".split(" ").forEach(function(val, key) {
// do stuff here
});
(或者,如果您不需要key
变量,请将其关闭[例如,...forEach(function(val) {...
]。)
即使浏览器没有它,forEach
也是可以完全正确地“匀化”(模拟)的功能之一,即使在旧浏览器中,例如通过es5_shim.js或类似的。所以只需要包含垫片(或编写自己的垫片)并愉快地使用它,无论它是原生支持还是你添加的东西。或者您可能正在使用已经提供它的库或它的类似物(jQuery有$.each
,Prototype向数组添加each
,Backbone提供类似的东西等。)
forEach
还有一个优点,即迭代器函数包含特定于循环的变量(entry
和index
),因此您不会污染您的范围。重新使用它。存在运行时开销,因为每个数组元素都有函数调用开销。但是函数调用的实际速度非常快(forEach
,这是一个狗),你可以确定你在循环体中做的其他任何东西都会完全消除额外的开销。
使用“旧”版本的JavaScript(第3版),没有内置任何内容,您可以提供自己的功能,也可以在每个循环上声明数组的变量(以及索引变量和数组条目变量),例如:
var array = "one two three".split(" ");
var key, val;
for (key = 0; key < array.length; ++key) {
val = array[key];
// do stuff here
}
但你又可以轻松提供自己的forEach
。
您可以在较旧和较新引擎中使用的另一个构造是for..in
,它迭代对象的可枚举属性。但是你仍然需要所有的变量。因为这不仅仅意味着“索引”,您还必须添加一些保护措施:
var array = "one two three".split(" ");
var key, val;
for (key in array) {
if (array.hasOwnProperty(key) && String(Number(key)) === key) {
// It's a numeric key and the object itself owns it
val = array[key];
// do stuff here
}
}
...但在这种情况下,它不会给你买任何东西。当数组稀疏时(例如,它有很大的间隙),这很有用。
答案 1 :(得分:5)
for/in
通常不用于数组,因为for
以较少的开销执行相同的基本操作,并且不需要在循环块上使用完整性包装器。
那就是说,鉴于您提出的情况,不,在这种情况下无法获得价值。由于for/in
只允许您获取密钥,因此您必须使用该密钥来访问对数组的引用中的值。