我对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);
现在我有两个问题。首先,为什么长度函数不考虑字符串索引项?其次,为什么在编号索引的情况下,数组大小是否增加到至少该数字?
答案 0 :(得分:4)
您必须了解JavaScript数组是对象,还有一些其他行为。就像对象一样,您可以为它们指定属性。
如果属性的名称是数字字符串且没有更高的数字键,则更新length
属性。非数字键不会影响length
属性。
Array.prototype
(filter
,slice
,...)中的方法仅适用于数组的数字键。
答案 1 :(得分:-1)
Javascript没有你在PHP中看到的关联数组。它有一个数组,它有一个与该值相关的数字索引,然后它有一些映射的对象key =>值。
Javascript Arrays和Javascript 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
在上面的示例中,您可以看到arr是一个数组,其值映射为index =>值,而obj是一个对象,其值被映射为key =>值。对象可以用作哈希映射/关联数组,但数组不能。
如果您想要获取对象/哈希映射中的值数,您可以随时...
Object.keys(OBJ)。长度
这是因为Object.keys(...)
将对象的键作为数组返回。
为了得到准确的答案,我应该澄清数组是对象,但是,它们的功能与对象固有的不同。根据文档,数组是“高级,类似列表的对象”