迭代值时,为什么当value是数字时,typeof(value)会返回“string”?使用Javascript

时间:2010-05-29 04:03:24

标签: javascript foreach typeof

我正在使用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的新手,非常感谢任何帮助,谢谢。

1 个答案:

答案 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
  }
}

这会检查属性是否由对象本身定义,而不是它通过原型链继承的对象。