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

2023-12-03

我使用 Google Chrome 进行此测试:

与直觉相反,第一个循环警告“string”三次,而第二个循环警告“number”三次。

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]));

我期望两个循环都会提醒“number”三次。 JavaScript 中的第一个循环是如何实现的?换句话说,如果for-each是语法糖,使用标准循环它的等价物是什么?

另外,是否有某种方法可以使用标准循环迭代对象的名称空间?我希望使用第二种循环来触及某些对象的每一个方法和属性。


您在第一个循环中看到“字符串”返回的原因是num指的是数组索引,不是值numarray在该索引处。尝试改变你的第一个循环来提醒num代替typeof num你会看到它输出 0、1 和 2,它们是索引,而不是数组的值。

当您使用for in循环,您正在迭代对象的属性,这并不完全等同于for在你的第二个例子中循环。 JavaScript 中的数组实际上只是以序列号作为属性名称的对象。它们被视为字符串typeof被关注到。

Edit:

正如马修指出的那样,在使用时,不能保证以任何特定顺序获取数组中的项目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 loop:

for (var prop in obj) {
  if (obj.hasOwnProperty(prop)) {
    // do something
  }
}

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

迭代值时,为什么当 value 是数字时 typeof(value) 返回“string”? JavaScript 的相关文章

随机推荐