循环语法的Javascript
作为javascript开发人员,我们都必须编写大量for循环。几个月前,我看到了另一种语法,我非常喜欢。然而,我现在感兴趣的是,还有其他好办法吗 假设我有一个表示系统中用户的数据数组。我以前做的是:循环语法的Javascript,javascript,Javascript,作为javascript开发人员,我们都必须编写大量for循环。几个月前,我看到了另一种语法,我非常喜欢。然而,我现在感兴趣的是,还有其他好办法吗 假设我有一个表示系统中用户的数据数组。我以前做的是: var users = [ { name: "A"}, { name: "B"}, { name: "C"}, { name: "D"}, { name: "E"} ]; var numOfUsers = users.length; for(var i=0
var users = [
{ name: "A"},
{ name: "B"},
{ name: "C"},
{ name: "D"},
{ name: "E"}
];
var numOfUsers = users.length;
for(var i=0; i<numOfUsers; i++) {
var user = users[i];
// ...
}
我还想知道第二种方法是否会在某些浏览器中产生问题。我的一位同事报告说,在IE下,这种语法有点错误
编辑:
谢天谢地,下面的答案为我指明了正确的方向。如果数组的某些元素错误,则循环将停止。有一种解决方案:
for(var i=0; typeof (user=users[i]) !== "undefined"; i++) {
// ...
}
但这对我来说太过分了。因此,我想只有当我100%确定所有元素都是真的(这意味着永远不会:)时,我才会使用这种语法。如果第二种语法在所有地方都有效,我会感到惊讶。对于每个要完成的循环,您的中间操作都应计算为true,而一旦要完成循环,则应计算为false。对于第一个for循环的任何问题,JavaScript都是函数作用域,因此内部var语句仍将泄漏到包含函数(以及
i
)。这与具有块作用域的大多数其他语言不同。这不是一个很大的问题,但如果您正在调试,则需要记住这一点 在“新”方法中,您不再需要numOfUsers
至于潜在的问题:这种方法依赖于所有
用户[i]
的值评估为true
,循环才能继续(并且用户
变得未定义
,等于假
,因此在处理最后一个用户后结束循环)–但有时您可能会有数据,其中并非每个记录的计算结果都是true
,但数据中也可能出现“false-y”值–在这种情况下,这种方法当然会失败。这种方法的问题是:
for(var i=0; user=users[i]; i++) {
// ...
}
…它假定用户
不会是“虚假的”(0
,“
,null
,未定义的
,NaN
,当然也不会是虚假的
),直到您经过数组的末尾。因此,它可以很好地处理非空对象引用数组,但是如果你养成了使用它的习惯,那么当你有一个数字、字符串等数组时,它会咬你一口
不在for
构造中声明变量的另一个原因是它具有误导性:这些变量不作用于for
循环,它们是函数范围的。(JavaScript的var
没有块作用域,只有函数或全局作用域;ES6将获得let
,后者将具有块作用域。)
在现代JavaScript引擎上(或使用“ES5垫片”),您当然可以这样做:
users.forEach(function(user) {
// ...
});
…它的优点是简洁,不必声明
i
或numuers
甚至user
(因为它是迭代回调的一个参数,并且很好地限定了它的范围)。如果您担心为每个条目执行函数调用的运行时成本。它将被您在函数中所做的任何实际工作冲掉。如果您已经在使用jQuery,您可以使用jQuery。每个函数都可以在数组上循环
在任何情况下,您都可以查看该函数的源代码,并为自己的foreach
函数复制相关部分:它实际上在我机器上的每个浏览器中都能工作,而在我经常使用它的Nodejs下,更重要的是它能工作。是的,过了一段时间用户[I]
会开始给出未定义的,这是Falsy这不是JavaScript第一次让我惊讶了。我将深入研究这个问题,但我的直觉是,问题可能来自一个数组,当你不在最后时,它可能合并为false。如果它是一个布尔值数组呢?还是在中间有一个零的输入?是的,这是CBroe指出的,我相信这是这个语法中唯一的一个问题。我会继续使用它,但只有当我确定我所有的数组元素都是真的。啊哈。。。这就是我同事报告问题的原因。可能他在数组中有一个虚假的值。您也适用于numOfUsers
(复制粘贴打字)。有一些代码可以解决部分问题,但这仍然不是一个好主意。(我编辑了我的问题)谢谢。我只是想拥有一个无依赖性的替代方案。re“只有当我100%确定所有元素都是真实的(这意味着永远不会:)”—当然,您应该了解数据的外观,并且可以依赖它;这叫做“先决条件”,我的经验告诉我,我应该期待一切。即使我手动定义数据,也可能会出错。我宁愿尝试尽早检测出出错的地方,而不是尝试让所有其他代码在无效输入下工作。
users.forEach(function(user) {
// ...
});