2014-01-19 130 views
0
var a = ['a', 'b', 'c']; 

for(var prop in a){ 
    console.log(prop); // '0', '1', '2' 
} 

console.log([] instanceof Object, a['0']); //true, 'a' 

基于上面的代码,假设创建新数组时,每个索引都设置为其相应基础对象上的属性是正确的吗?这是指定的地方?Array对象索引属性

+1

Arrays _are_ objects;没有“基础对象”。 – SLaks

+0

@SLaks我认为他的意思是本机对象。 –

+0

@RoyiNamir:没有这样的事情存在。 – SLaks

回答

1

你不应该使用这个构造:

for(var prop in a) 

用于遍历数组的元素。它迭代对象和所有数组元素的所有可迭代属性,而不仅仅是数组元素。数组元素应当与任一此样式被重复:

for (var i = 0; i < a.length; i++) { 
    // a[i] 
} 

或(在现代浏览器):

a.forEach(function(value, index) { 
    // use value here 
}); 

阵列也是对象。它可以具有数组元素之外的属性。所有数组元素都可以像使用字符串键的属性那样访问是正确的,但这仍然不是仅迭代数组元素的期望方式。

例如,你可以这样做:

var a = ['a', 'b', 'c']; 
a.whatever = 3; 

for(var prop in a){ 
    console.log(prop); // '0', '1', '2', 'whatever' 
} 
+0

我知道我不应该这样做。它似乎没有迭代实际的_elements_,而是添加到对象的属性。要访问实际的元素,我必须做一些像'a [prop]',而不是'prop'的东西。由于'Array'是一个'Object',我想知道在创建新数组时是否可以安全地将这些属性添加到对象本身? – Johan

+0

@Johan - 假设可以使用属性表示法访问数组元素,并且'for ... in'表示法将包含数组元素(除了属性),这是安全的。但是,它是一个数组元素。没有“属性”被添加到对象perse。这是一个数组元素,并且存在细微差别 - 它们不是同一件事。例如,'.length'中只包含数组元素。 – jfriend00

+0

如果没有添加任何属性,那我为什么要访问'a ['0']',它本质上与'a.0'相同(显然不能编译)? – Johan

0

for(... in ...)用于循环对象的属性和方法。

对于像你使用的数组,你想要使用经典的(i = 0; i <长度; i ++)。

1

是的,我相信这是规范的一部分:数组是一个对象,它的名字是性能指标转换为字符串。这有点丑。

+0

同意。感谢您回答实际问题。 – Johan