javascript中vs与var之间的差异

时间:2016-05-26 10:26:32

标签: javascript for-loop for-in-loop

我在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 }

4 个答案:

答案 0 :(得分:2)

好吧,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(;;)

答案 1 :(得分:0)

就像它在the MDN documentation中说的那样:

  

for ... in statement 迭代一个的可枚举属性   对象,以任意顺序。对于每个不同的属性,语句都可以   被执行。

您的第一个语句用于数组,而第二个语句用于获取对象的所有键。

答案 2 :(得分:0)

这个问题已经有讨论和答案了。

请参阅Question以了解其中的差异。

  

for ... in语句以任意顺序迭代对象的可枚举属性。对于每个不同的属性,可以执行语句。

     

for语句创建一个循环,该循环由三个可选表达式组成,括在括号中并用分号分隔,后跟一个语句或循环中执行的一组语句。

答案 3 :(得分:0)

JavaScript没有关联数组(严重)。因此,根据您的PHP数据,您可能会以完全不同的类型结束,例如:

["Zero","One","Two"]     <-- Array
{"5":"Five","10":"Then"} <-- Object
{"Foo":"Bar"}            <-- Object
var x in ruleList

由于JavaScript数组是JavaScript对象的一个​​子集,你会发现import java.util.ArrayList; import java.util.Collection; import java.util.HashSet; import java.util.List; import java.util.Set; public class Permutations { public static <T> Collection<List<T>> generatePermutationsNoRepetition(Set<T> availableNumbers) { Collection<List<T>> permutations = new HashSet<>(); for (T number : availableNumbers) { Set<T> numbers = new HashSet<>(availableNumbers); numbers.remove(number); if (!numbers.isEmpty()) { Collection<List<T>> childPermutations = generatePermutationsNoRepetition(numbers); for (List<T> childPermutation : childPermutations) { List<T> permutation = new ArrayList<>(); permutation.add(number); permutation.addAll(childPermutation); permutations.add(permutation); } } else { List<T> permutation = new ArrayList<>(); permutation.add(number); permutations.add(permutation); } } return permutations; } } (它通过对象属性循环)在两种情况下都有效,但是当你有一个数组时它不会做你期望的