Javascript数组显示不一致的行为

时间:2017-09-20 15:30:16

标签: javascript arrays hashmap associative-array

我对javascript数组以及索引如何在这些数组中工作感到困惑。无论数组中有多少个键值元素,数组的长度始终为0。我们还可以看到,只要键是字符串,数组只有两个元素。让我们考虑方案1,我有以下代码。

arr = [];
arr['home'] = 1234;
arr['cat'] = 12345;
console.log(arr.length);
console.log(arr);

现在考虑第二种情况,我有一个空数组,我给数组的第20个索引分配了一些数字。然后当我输出数组时,长度显示21,其他所有位置都是'undefined'。

arr = [];
arr[20] = 20;
console.log(arr.length); // Length shows 20 Size of array increased to 21

现在在第三个场景中,我将分配编号索引和字符串索引,它显示另一个奇怪的行为。数组的长度不计算基于字符串的索引的值。即使我有4个数字索引和一个基于字符串的索引。所以长度应为6,但长度为5。

arr = [];
arr[4] = 4;
arr['home'] = 'home';
console.log(arr);

现在我有两个问题。首先,为什么长度函数不考虑字符串索引项?其次,为什么在编号索引的情况下,数组大小是否增加到至少该数字?

2 个答案:

答案 0 :(得分:4)

您必须了解JavaScript数组是对象,还有一些其他行为。就像对象一样,您可以为它们指定属性。

如果属性的名称是数字字符串且没有更高的数字键,则更新length属性。非数字键不会影响length属性。

Array.prototypefilterslice,...)中的方法仅适用于数组的数字键。

答案 1 :(得分:-1)

Javascript没有你在PHP中看到的关联数组。它有一个数组,它有一个与该值相关的数字索引,然后它有一些映射的对象key =>值。

Javascript ArraysJavascript Objects

const arr = [1, 2, 3, 4, 5, 6, 7];

console.log(arr.length); // outputs 7

const obj = {}

console.log(obj.length); // undefined

// set the key => value for obj from arr

arr.forEach(a => obj[a] = a);

console.log(obj[0]); // undefined
console.log(obj[1]); // 1

console.log(arr[0]); // 1
console.log(arr[1]); // 2

JS Bin

在上面的示例中,您可以看到arr是一个数组,其值映射为index =>值,而obj是一个对象,其值被映射为key =>值。对象可以用作哈希映射/关联数组,但数组不能。

如果您想要获取对象/哈希映射中的值数,您可以随时...

Object.keys(OBJ)。长度

这是因为Object.keys(...)将对象的键作为数组返回。

为了得到准确的答案,我应该澄清数组是对象,但是,它们的功能与对象固有的不同。根据文档,数组是“高级,类似列表的对象”