【发布时间】:2009-12-11 06:24:58
【问题描述】:
这个 Javascript 逻辑让我感到困惑。我正在创建一个数组并将它的第一个元素设置为一个数字。当我使用“for”循环进行交互时,Javascript 会将数组键转换为字符串。为什么?我希望它保持一个数字。
stuff = [];
stuff[0] = 3;
for(var x in stuff) {
alert(typeof x);
}
【问题讨论】:
标签: javascript
这个 Javascript 逻辑让我感到困惑。我正在创建一个数组并将它的第一个元素设置为一个数字。当我使用“for”循环进行交互时,Javascript 会将数组键转换为字符串。为什么?我希望它保持一个数字。
stuff = [];
stuff[0] = 3;
for(var x in stuff) {
alert(typeof x);
}
【问题讨论】:
标签: javascript
这是因为您使用 for...in 循环遍历数组,这通常用于循环对象的属性。 javascript 引擎可能正在转换为字符串,因为字符串类型适用于对象属性的名称。
试试这个更传统的方法:
stuff = [];
stuff[0] = 3;
for(var i=0; i<stuff.length; i++) {
var x = stuff[i];
alert(typeof x);
}
【讨论】:
for..in 不是为遍历数组而设计的。请改用 C 风格的 for 循环。
参考:MDC
【讨论】:
Javascript 中的for .. in 循环遍历对象的属性。在 Javascript 中,属性名称是字符串,而数组只是具有一堆看起来像数字的属性的对象。
【讨论】:
for...in 语句应该用于迭代对象属性,对于数组使用简单的for 循环:
var stuff = [];
stuff.push(3);
for(var i = 0; i < stuff.length; i++) {
alert(stuff[i]);
}
为什么不应该将for...in 与数组一起使用?
Array.prototype 或Object.prototype 中定义的属性。有关最近回答的问题的更多详细信息:
【讨论】:
避免在performance-critical 函数中使用for-in。
The for-in loop requires the script engine to build a list of all the enumerable properties,并检查该列表中的重复项,然后才能开始枚举。The for-in loop breaks when you extend Array object using prototype.【讨论】:
问题在于,在 JavaScript 中切换到关联数组非常容易,关联数组实际上不是数组而是对象。但是,for..in 循环适用于对象,其索引是字符串。
【讨论】: