JavaScript数组是否真的是地图

时间:2016-03-26 21:54:50

标签: javascript arrays abstract-data-type

在JavaScript中,您可以通过各种方式将变量或对象放入数组中:

array.push(item)
array[2] = item;
array[somevariable] = item

以上例子的后者让我困扰

例如说我有以下变量var somevariable = 'someString';

如果您愿意,我可以将其作为索引(或键)放入array

此行为主要见于Map界面,表明JavaScript中的数组不属于List类型。

另一个注意事项是JavaScript中的Array object也有一个pop方法,可以在Queue界面中看到。

所以我的问题是Array中的JavaScript数据类型是什么?

2 个答案:

答案 0 :(得分:4)

数组只是具有一些特殊方法和行为的对象。

作为对象,您可以在其中存储属性。键必须是字符串(或ES6中的符号),值可以是任何值。

但是,数组方法只考虑名称为数组索引的属性。

  

15.4 Array Objects

     

数组对象对某类属性进行特殊处理   名。属性名称​​ P (以String值的形式)是   数组索引当且仅当ToStringToUint32(P))等于 P ToUint32 P )不等于2 32 -1。

建议仅在数组中使用数组索引。如果需要其他属性,则无法使用数组方法。但是最好更好地使用普通物体。或者也许是ES6地图,其键和值可以是任何东西。

规范没有说明应该如何实现数组。大多数实现在只有数组索引的情况下使用某种列表,但如果添加其他属性则切换到哈希。

答案 1 :(得分:1)

数组既是对象又是数组。这就是为什么你可以添加命名属性的方式,就像你可以将命名属性添加到对象或函数一样。

您可以告诉数组是一个对象:

var a = [];
console.log(typeof a);

将打印“对象”

如果您需要测试变量是否实际上是一个数组,您可以使用:

Array.isArray(a);