我正在使用Google Chrome进行此测试: 与直觉相反,第一个循环警告“字符串”3次,而第二个循环警告“数字”3次。
numarray = [1, 2, 3];
//for-each loop
for(num in numarray)
alert(typeof(num));
//standard loop
for(i=0; i<numarray.length; i++)
alert(typeof(numarray[i]));
我期待两个循环警告“数字”3次。如何在Javascript中实现第一个循环?换句话说,如果for-each是语法糖,使用标准循环它的等价物是什么?
另外,有没有办法使用标准循环迭代对象的命名空间?我希望使用第二种循环来触摸某些对象的方法和属性中的每一个。我是Javascript的新手,非常感谢任何帮助,谢谢。
答案 0 :(得分:6)
您在第一个循环中看到“string”返回的原因是num
引用数组索引,而不是该索引处numarray
的值。尝试更改第一个循环以提醒num
而不是typeof num
,您会看到它吐出0,1和2,这是指标而不是数组的值。
当您使用for in
循环时,您将迭代对象的属性,这与第二个示例中的for
循环不完全相同。 JavaScript中的数组实际上只是具有序列号作为属性名称的对象。就typeof
而言,它们被视为字符串。
修改强>
正如Matthew所指出的那样,在使用for in
循环时,不能保证以任何特定顺序获取数组中的项,部分原因是,建议不要以这种方式迭代数组。
filip-fku询问此行为何时使用for in
会很有用。一个例子是当属性名称本身具有含义时,对于数组指示不是这种情况。例如:
var myName = {
first: 'Jimmy',
last: 'Cuadra'
};
for (var prop in myName) {
console.log(prop + ': ' + myName[prop]);
}
// prints:
// first: Jimmy
// last: Cuadra
值得注意的是,for in
循环也会遍历对象原型链的属性。出于这个原因,这通常是您想要构建for in
循环的方式:
for (var prop in obj) {
if (obj.hasOwnProperty(prop)) {
// do something
}
}
这会检查属性是否由对象本身定义,而不是它通过原型链继承的对象。