这个问题在这里已有答案:
我在PHP中填充关联数组并在JS函数中访问该数组。我使用json_encode()将PHP数组转换为JS数组。我使用IE 8来运行此应用程序。在一些使用IE 8 for(;;)的机器上工作但在其他机器上失败。在IE 8 for(var in)工作的一些机器中,但在其他机器中失败。以下代码有什么区别?
for (var k = 0; k < ruleList.length; k++){ //do something }
for (var x in ruleList){ //do something }
好吧,for(i in x)
适用于数组和对象
var x = [1, 2, 3];
for(var i in x) console.log(x[i]);
var o = {1:1, 2:2, 3:3};
for(var i in o) console.log(o[i]);
虽然for(;;)
只适用于数组
var x = [1, 2, 3];
for(var i=0; i<x.length; i++) console.log(x[i]);
var o = {1:1, 2:2, 3:3};
for(var i=0; i<o.length; i++) console.log(x[i]); // returns undefined because object o doesn't have property length
但是你可以使用Object.keys
获取对象的数组键
var o = {1:1, 2:2, 3:3};
var keys = Object.keys(o);
for(var i=0; i<keys.length; i++) console.log(o[keys[i]]);
通常的做法是使用for(i in x)
作为对象,使用for(;;)
作为数组
就像在the MDN documentation中所说:
for ... in语句以任意顺序迭代对象的可枚举属性。对于每个不同的属性,可以执行语句。
您的第一个语句用于数组,而第二个语句用于获取对象的所有键。
已经有这个问题的讨论和答案了。
请参阅Question以了解其中的差异。
for ... in语句以任意顺序迭代对象的可枚举属性。对于每个不同的属性,可以执行语句。
for语句创建一个循环,该循环由三个可选表达式组成,括在括号中并用分号分隔,后跟一个语句或循环中执行的一组语句。
JavaScript没有关联数组(严重)。因此,根据您的PHP数据,您可能会以完全不同的类型结束,例如:
<?php
$consecutive_keys = array(
0 => 'Zero',
1 => 'One',
2 => 'Two',
);
$sparse_keys = array(
5 => 'Five',
10 => 'Then',
);
$dictionary = array(
'Foo' => 'Bar',
);
echo json_encode($consecutive_keys) . PHP_EOL;
echo json_encode($sparse_keys) . PHP_EOL;
echo json_encode($dictionary) . PHP_EOL;
["Zero","One","Two"] <-- Array
{"5":"Five","10":"Then"} <-- Object
{"Foo":"Bar"} <-- Object
由于JavaScript数组是JavaScript对象的一个子集,因此你会发现var x in ruleList
(循环遍历对象属性)在两种情况下都有效,但是当你有一个数组时它不会做你期望的。