Javascript 对于(…;in…;)不使用数组

Javascript 对于(…;in…;)不使用数组,javascript,Javascript,我不知怎么搞糊涂了: 我有如下命令列表: var commands = [{"command": "read"}, {"command": "write"}, {"command": "login"}]; 如果我尝试访问以下命令之一,它将正常工作: console.log(commands[0]["command"]); // Output is "read" console.log(commands[0].command); // Output is "read" 但如果我尝试这样做

我不知怎么搞糊涂了:

我有如下命令列表:

var commands = [{"command": "read"}, {"command": "write"}, {"command": "login"}];
如果我尝试访问以下命令之一,它将正常工作:

console.log(commands[0]["command"]); // Output is "read"
console.log(commands[0].command);    // Output is "read"
但如果我尝试这样做,输出总是未定义的:

for(command in commands)
    console.log(command["command"]); // undefined, undefined, undefined
像这样使用它

 for(var x in commands)
      console.log(commands[x].command);

for
在javascript中执行数组迭代,因此您需要:

for(command in commands)
    console.log(commands[command]["command"]);
例如,示例中的
命令
变量是数组索引,而不是数组中的枚举项。

是否尝试过:

for(command in commands[0]) {
    console.log(command["command"]);
}

用于。。。在construct中,迭代数组中对象的键,而不是对象本身。所以你需要写:

for(index in commands)
    console.log(commands[index]["command"]);
(…in.)的
构造用于在对象上循环,而不是数组。由于您有一个对象数组,因此应该执行以下操作:

for (var i = 0, j = commands.length; i < j; i += 1) {
  console.log(commands[i].command);
}
for(变量i=0,j=commands.length;i

有关为什么应将此
用于
构造而不是
用于
中的…的详细说明,请参阅。

为什么将
用于
中的?只需通过索引访问,还可以避免原型扩展的潜在问题(请参见
hasOwnProperty


如果您的commands变量是json,那么尽管有下面的一些答案,您也可以这样做,不要在数组中使用
for。在JavaScript中,这是一个错误的工具。一个
for
循环或
forEach
方法只确保数字索引以保证的顺序,并且不会阻止您扩展
数组的能力。如果您选择prototype
。呃,不,他已经清楚地定义了一个他希望迭代的对象数组:
var commands=[{“command”:“read”},{“command”:“write”},{“command”:“login”}];
@Martin OP实际上正在创建一个对象数组。该数组是循环的对象,作为
循环的
更自然。这不会起作用,因为
命令[0]。command
“read”
字符串,所以
命令[0]。command[“command”]
将为您提供
未定义的
。另外:您可以使用functional style forEach/every/any=)@Santiago-我不知道您的意思,想详细说明一下吗?不,您的答案很完美!我正在向OP讲话。对于他想要的行为,他可以使用forEach。
var i,len=commands.length;

for (i=0;i<len;i++ ) {
    console.log commands[i].command
}
for (i=commands.length-1;i>=0;i-- ) {

}
var i=commands.length;
while (i--) {
   ...
}