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

Mar*_*ark 5 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]));
Run Code Online (Sandbox Code Playgroud)

我期待两个循环警告"数字"3次.如何在Javascript中实现第一个循环?换句话说,如果for-each是语法糖,使用标准循环的等价物是什么?

另外,有没有办法使用标准循环迭代对象的命名空间?我希望使用第二种循环来触摸某些对象的方法和属性中的每一个.我是Javascript的新手,非常感谢任何帮助,谢谢.

Jim*_*dra 6

你在第一个循环中看到"string"返回的原因是num引用数组索引,而不是该索引的值numarray.尝试将第一个循环更改为警报num而不是,typeof num您将看到它吐出0,1和2,这是指标而不是数组的值.

当您使用for in循环时,您将迭代对象的属性,这与for第二个示例中的循环不完全相同.JavaScript中的数组实际上只是具有序列号作为属性名称的对象.就所typeof涉及的问题而言,它们被视为字符串.

编辑:

正如Matthew所指出的那样,当使用for in循环时,你不能保证以任何特定顺序获取数组中的项,部分原因是,不推荐以这种方式迭代数组.

for in鉴于此行为,filip-fku会询问何时使用它会有用.一个例子是当属性名称本身具有含义时,对于数组指示不是这种情况.例如:

var myName = {
  first: 'Jimmy',
  last: 'Cuadra'
};

for (var prop in myName) {
  console.log(prop + ': ' + myName[prop]);
}

// prints:
// first: Jimmy
// last: Cuadra
Run Code Online (Sandbox Code Playgroud)

值得注意的是,for in循环还将遍历对象原型链的属性.因此,这通常是您想要构建for in循环的方式:

for (var prop in obj) {
  if (obj.hasOwnProperty(prop)) {
    // do something
  }
}
Run Code Online (Sandbox Code Playgroud)

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

  • 无法保证按顺序访问数组元素.请参阅MDC上的[for ... in](https://developer.mozilla.org/en/core_javascript_1.5_reference/Statements/for...in):"迭代数组可能无法按数字顺序访问元素".这是...的主要原因通常不建议用于数组. (2认同)