3

我有以下数组:

var arr = [];
console.log(arr.length); //Output: 0

arr["1231321"] = "abcd";
console.log(arr.length); //Output: 1231322

arr["1231321".toString()] = "abcd";
console.log(arr.length); //Output: 1231322

arr["a1231321"] = "abcd";
console.log(arr.length); //Output: 0

arr["1231321a"] = "abcd";
console.log(arr.length); //Output: 0

这是小提琴:http: //jsfiddle.net/HcrcR/

当我将我的 arr 更改为var arr = {};then 它就可以工作了。

但是即使我使用字符串键它开始从键中推送数据,它的原因是什么?

4

3 回答 3

6

我有以下数组/哈希图:

这是ArrayJavaScript 术语。

var arr = [];
console.log(arr.length); //Output: 0

这是预期的,它是一个空数组。

arr["1231321"] = "abcd";
console.log(arr.length); //Output: 1231322

length属性如此之大的原因总是+1比最高指数。使用字符串并不重要,Arrays 和Objects 的键在 JavaScript 中始终是字符串。

此 Array 对象的长度属性是一个数据属性,其值始终在数值上大于名称为数组索引的每个可删除属性的名称。

来源

arr["1231321".toString()] = "abcd";
console.log(arr.length); //Output: 1231322

调用toString()一个字符串不会做任何事情(它已经是一个字符串)。

arr["a1231321"] = "abcd";
console.log(arr.length); //Output: 0

还可以预料的是,您在其上设置了一个Array看起来不像索引的属性。

arr["1231321a"] = "abcd";
console.log(arr.length); //Output: 0

往上看。字符串内部没有解析来尝试获取数字。

当我将我的 arr 更改为var arr = {};then 它就可以工作了。

这就是对象在 JavaScript 中的工作方式。它们只是一串值的字符串键。

于 2013-03-04T22:10:21.687 回答
4

Array != Object (or hashmap)在 JavaScript 中。因此,添加到不是整数索引的数组的属性不会影响Array.length

注意没有预留空间,仅仅因为长度为1231321,并不意味着所有的空间都被分配了,JavaScript数组不必使用连续内存,稀疏的情况下通常也不需要。实际上,它们只是作为优化的连续性,默认行为是它们就像对象一样是哈希映射。

如果你需要知道一个对象的所有键,你需要使用https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/keys

但是,您不应该混合这两个概念,在 JS 中,您应该使用数组(数字索引)或对象(任何索引)

当你这样做

arr["1231321"] = "abcd";

那是一样的

arr[1231321] = "abcd";

这会影响length数组的。然而,

arr["1231321a"] = "abcd"

不创建新的数组索引(只是一个新的对象属性)并且不影响length属性

请注意,如果您一个接一个地键入以下命令,则您问题中的示例不正确

arr = [];
arr["1231321"] = "abcd";
console.log(arr.length); //Output: 1231322
arr["a1231321"] = "abcd";
// Output: 1231322, should be the same as before, not undefined
console.log(arr.length); //Output: 1231322

http://jsfiddle.net/tWCa4/

于 2013-03-04T22:16:14.943 回答
2

它能够使用您的前 2 个字符串作为索引,因为它们能够被解析为数字。

当您将无法解析为整数的内容传递给它时,数组会将其附加为数组的属性,而不是条目。

当您将其定义为对象时,它将充当对象并将所有内容视为字符串属性。长度将始终定义为 javascript 中数组的最大值+1。

所以要清楚

var x = [] 

创建一个新的Array,它将尝试将其输入解析为整数并将它们添加到数组中,但否则会将它们分配为属性。

var x = {}

将创建一个对象,它作为一组无序的属性工作,并且没有长度,除非您自定义定义x.length = y,在这种情况下,它将只是另一个没有特殊含义的属性。

于 2013-03-04T22:09:18.923 回答