JavaScript 数组真的是 map 类型吗

Is the JavaScript array really of type map

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

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

上面例子中的后者是困扰我的地方

举例来说,我有以下变量 var somevariable = 'someString';

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

此行为主要出现在 Map 接口中,表明 JavaScript 中的数组不是 List 类型。

另一个注意点是 JavaScript 中的 Array object 也有一个 pop 方法,可以在 Queue 接口中看到。

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

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

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

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

15.4 Array Objects

Array objects give special treatment to a certain class of property names. A property name P (in the form of a String value) is an array index if and only if ToString(ToUint32(P)) is equal to P and ToUint32(P) is not equal to 232−1.

建议仅在数组中使用数组索引。如果你想要其他属性,你将无法对它们使用数组方法。但是最好使用普通对象。或者可能是 ES6 映射,其键和值可以是任何东西。

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

数组既是对象又是数组。这就是为什么您可以像向对象或函数添加命名属性一样向其添加命名属性的原因。

你可以说数组是一个对象:

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

将打印 "object"

如果你需要测试一个变量是否真的是一个数组你可以使用:

Array.isArray(a);