迭代值时,为什么 typeof(value) 返回“string"?当值是一个数字时?JavaScript [英] When iterating over values, why does typeof(value) return "string" when value is a number? JavaScript

查看:17
本文介绍了迭代值时,为什么 typeof(value) 返回“string"?当值是一个数字时?JavaScript的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用 Google Chrome 进行此测试:

I'm using Google Chrome for this test:

与直觉相反,第一个循环提示string";三次,而第二个循环警告数字"三遍.

Contrary to intuition, the first loop alerts "string" three times, while the second loop alerts "number" three times.

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

我原以为两个循环都会提醒数字"三次.JavaScript 中的第一个循环是如何实现的?换句话说,如果 for-each 是语法糖,那么它使用标准循环的等价物是什么?

I was expecting both loops to alert "number" three times. How is the first loop implemented in JavaScript? In other words, if the for-each is syntactic sugar, what is its equivalent using a standard loop?

此外,是否有某种方法可以使用标准循环遍历对象的命名空间?我希望使用第二种循环来触及某些对象的每一个方法和属性.

Also, is there some way to iterate over an object's namespace using a standard loop? I'm looking to touch every one of some object's methods and attributes using a loop of the second kind.

推荐答案

您在第一个循环中看到string"返回的原因是 num 指的是 数组索引,而不是该索引处 numarray 的值.尝试将您的第一个循环更改为 alert num 而不是 typeof num,您会看到它吐出 0、1 和 2,它们是索引而不是值你的阵列.

The reason you're seeing "string" returned in your first loop is that num refers to the array index, not the value of numarray at that index. Try changing your first loop to alert num instead of typeof num and you'll see that it spits out 0, 1, and 2, which are the indicies and not the values of your array.

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

When you use a for in loop, you're iterating over the properties of an object, which is not exactly equivalent to the for loop in your second example. Arrays in JavaScript are really just objects with sequential numbers as property names. They are treated as strings as far as typeof is concerned.

正如 Matthew 指出的那样,在使用 for in 循环时,不能保证以任何特定顺序获取数组中的项目,部分原因是,不建议迭代数组那样.

As Matthew points out, you're not guaranteed to get the items in the array in any particular order when using a for in loop, and partly for that reason, it's not recommended to iterate through arrays that way.

filip-fku 询问什么时候使用 for in 会有用,给定这种行为.一个例子是当属性名称本身具有含义时,数组索引并非如此.例如:

filip-fku asks when it would be useful to use for in, given this behavior. One example is when the property names themselves have meaning, which is not really the case with array indicies. For example:

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 循环的方式:

It's also worth noting that for in loops will also iterate through properties of the object's prototype chain. For that reason, this is usually how you'd want to construct a for in loop:

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

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

This does a check to see if the property was defined by the object itself and not an object it's inheriting from through the prototype chain.

这篇关于迭代值时,为什么 typeof(value) 返回“string"?当值是一个数字时?JavaScript的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆