Javascript 为什么数组即使使用字符串键也会保留这么多空格?

Javascript 为什么数组即使使用字符串键也会保留这么多空格?,javascript,arrays,hashmap,Javascript,Arrays,Hashmap,我有以下数组: 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

我有以下数组:

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
这是小提琴:

当我将我的arr更改为
var arr={}然后它就工作了


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

它可以使用前两个字符串作为索引,因为它们可以被解析为数字

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

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

所以说得很清楚

var x = [] 
创建一个新的
数组
,该数组将尝试将其输入解析为整数并将其添加到数组中,但会将其指定为属性

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

我有以下数组/哈希映射:

用JavaScript术语来说,这是一个
数组

var arr = [];
console.log(arr.length); //Output: 0
这是意料之中的,它是一个空数组

arr["1231321"] = "abcd";
console.log(arr.length); //Output: 1231322
length
属性之所以如此大,是因为它总是
+1
比最高索引大。使用字符串并不重要,
Array
s和
Object
s的键在JavaScript中始终是字符串

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

对字符串调用
toString()
,没有任何作用(它已经是一个字符串)

同样,您应该在
数组上设置一个看起来不像索引的属性

arr["1231321a"] = "abcd";
console.log(arr.length); //Output: 0
见上文。没有对字符串进行内部解析以尝试获取数字

当我将我的arr更改为
var arr={}然后它就工作了

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

数组!=对象(或hashmap)
在JavaScript中。因此,添加到非整数索引数组中的属性不会影响
array.length

请注意,没有保留空间,只是因为长度是1231321,这并不意味着所有空间都已分配,JavaScript数组不必使用连续内存,如果它们是稀疏的,通常也不需要。实际上,它们只是作为一种优化而连续的,默认的行为是它们就像对象一样是散列映射

如果需要知道对象拥有的所有关键点,则需要使用

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

当你这样做的时候

arr["1231321"] = "abcd";
那跟

arr[1231321] = "abcd";
这会影响数组的
长度。但是,

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

您有一个数组。当您使用
arr[“key”]
(非数字键…字符串仍然被转换)时,您正在设置属性,这些属性与它的内容/长度无关。当您使用:var arr={}时,这可能是相关的。您有一个使用键/值对的对象。然后我们可以说,当我们使用数组时,如果可能,JS将字符串键转换为数字。但是,当我们创建一个对象时,它会使用自己的type@VuryJavaScript键始终是字符串,即使对于数组也是如此。我没有向下投票,但第一行不是真的,没有对数字进行强制转换。也没有向下投票,但没有对数字进行强制转换,
Array
所做的就是查看所有键,把那些看起来像整数的视为整数。是的,这不是正确的术语。谢谢你的解释。我不在乎否决票,我想说得准确点:)我的更新看起来更好吗?但是,你不应该把这两个概念混在一起,很高兴你提到了这一点,这对停止混乱非常重要:)
arr["1231321a"] = "abcd"
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