Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
循环语法的Javascript_Javascript - Fatal编程技术网

循环语法的Javascript

循环语法的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

作为javascript开发人员,我们都必须编写大量for循环。几个月前,我看到了另一种语法,我非常喜欢。然而,我现在感兴趣的是,还有其他好办法吗

假设我有一个表示系统中用户的数据数组。我以前做的是:

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) {
    // ...
});