JavaScript数组:字符串索引项

时间:2014-12-19 19:57:00

标签: javascript node.js

我最近对JavaScript数组索引的性质有点了解。追求它,我发现了以下内容(我在解释模式中使用Node.js):

var x=[];
x['a']='a';
console.log(x); // Yields [ a: 'a' ]
console.log(x.length); // yields 0 not 1
x[1]=1;
console.log(x); // Yields [ , 1, a: 'a' ]
console.log(x.length); // Yields 2 not 3 (one for empty 0 space, one for the occupied 1 space)

a: 'a'真的是它的样子 - 嵌入在数组中的对象属性 - 因此,不计入数组属性.length

3 个答案:

答案 0 :(得分:13)

在JavaScript中,数组只是具有一些特殊属性的对象,例如自动length属性,以及附加的一些方法(例如sortpopjoin等)。实际上,a将不会计入您的数组中,因为数组的length属性仅存储具有可以用32位正整数表示的属性名称的元素数量

由于数组总是自动将每个带编号的元素定义为具有正32位int属性名称的最高元素,这实际上意味着length属性存储 1高于具有最高32的元素-bit integer作为属性名称。感谢@ Felix Kling在评论中纠正了我。

根本不禁止添加a等属性,但您应该注意它们,因为在阅读代码时可能会感到困惑。

在遍历数组中的元素时也存在差异:

浏览所有编号的元素:

for (var i=0; i<myArray.length; i++) {
    //do something
}

浏览每个不属于内置的属性:

for (var i in myArray) {
    //do something
}

请注意,此循环还包含Array.prototype中包含的任何内置方法。因此,如果您要添加Array.prototype.sum = function() {/*...*/};,它也将循环播放。

要确定您使用的对象是否确实是一个数组,而不仅仅是一个对象,您可以执行以下测试:

if (Object.prototype.toString.call(myObject) === '[object Array]') {
    //myObject is an array
} else if (typeof myObject === 'object') {
    //myObject is some other kind of object
}

请参阅@artem's commentmyObject instanceof Array可能无法始终正常运行。

答案 1 :(得分:3)

这是正确的,并且它很好地说明了您创建的新阵列实际上只是一种特殊的对象。事实上,typeof []'object'!在它上面设置一个命名属性(这里可能会更加干净地写成x.a = 'a')实际上是在你的&#34;真实&#34;周围设置了一个新属性给对象包装器。数组(编号属性,真的)。它们不会影响长度属性,原因与Array.isArray方法没有相同。

答案 2 :(得分:2)

是的,这是正确的。这是有效的,因为JavaScript中的所有内容都是一个对象,包括数组和函数,这意味着可以添加自己的任意字符串属性。那不是你说你应该这样做。

应使用非负整数对数组([])建立索引。对象({})应使用字符串“索引”。

相关问题