【问题标题】:Javascript Array Showing Inconsistent Behavior显示不一致行为的 Javascript 数组
【发布时间】:2018-03-01 18:11:35
【问题描述】:

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

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

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

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);

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

【问题讨论】:

  • 数组只能有数字键
  • 您是否尝试过运行代码。这是我问过的问题 - @RolandStarke

标签: javascript arrays hashmap associative-array


【解决方案1】:

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

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 => value,而 obj 是一个对象,其值映射为 key => value。对象可以用作哈希映射/关联数组,但数组不能。

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

Object.keys(obj).length

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

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

【讨论】:

  • 我同意它没有关联数组。但是我声明的同一个数组怎么会有数字和字符串索引项呢? @凯尔
  • @BILALAHMAD:你读过另一个答案吗?数组是对象。对象可以具有任意属性。
【解决方案2】:

您必须了解 JavaScript 数组是具有一些附加行为的对象。就像对象一样,您可以为它们分配属性。

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

Array.prototype (filter, slice, ...) 中的方法仅适用于数组的数字键。

【讨论】:

  • 不仅仅是任何数字属性。只有 0 到 2^32-1 之间的“整数”属性。
猜你喜欢
  • 2015-01-31
  • 1970-01-01
  • 2013-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-30
  • 1970-01-01
  • 2011-04-22
相关资源
最近更新 更多