JavaScript 数组元素仅仅是数组对象的属性吗?

Are JavaScript Array elements nothing more than Array object properties?

我观察到以下情况:

var o = {}; // empty JS object
var a = []; // empty JS array

o.myproperty = "I am property";
a.push("I am array element");

alert(o['myproperty']); // alerts "I am property"
alert(o.myproperty); // alerts "I am property"
alert(a[0]); // alerts "I am array element"
alert(a['0']); // alerts "I am array element"

/* Of course, accessing an array element using dot notation (e.g. a.0) would cause a
   SyntaxError: Unexpected number (in JavaScript variable names cannot begin with numbers.)
*/

另外:

'myproperty' in o // evaluates to true
0 in a // true
'0' in a // true

delete o.myproperty; // true, o is now empty
delete o['myproperty']; // true, o is now empty
delete a[0]; // true, a contains now 1 undefined element
delete a['0']; // true, a contains now 1 undefined element

似乎将一个元素添加到数组实际上会在数组对象上创建一个带编号的 属性,之后用于通过引用访问该元素。但是有些东西对这些 数组元素属性 的作用与它们对普通对象属性的作用完全不同(一个例子是上面的删除)。所以...

TL;DR ... javascript 数组元素是否通过不可见的编号数组对象属性通过引用访问?

编辑 似乎是这样:Why is using "for...in" with array iteration a bad idea?

要使访问器值成为数组中的索引,它应该:

  • 为非负整数(0, 1, 100, 200);
  • 如果转换为数字(来自string),它应该是一个非负整数('0','1.000')

例如:

a['100'] // as index a[100]
a['0']   // as index a[0]
a[1.00]  // as index a[1]

在所有其他情况下,访问器被视为数组对象的 属性

a[-1]       // as a property a['-1']
a['myProp'] // as a property a['myProp']

数组与常规对象的不同之处:使用索引时,length 属性 会自动更新。 length 应该总是比最高索引大 1。

数组是对象,最简单的理解方式是 [] instanceof Object 其中 returns true

是的,通过引用访问数组元素的方式与访问对象属性的方式相同。

当你删除一个Object的属性时,你实际上是将这个属性设置为undefined,所以对于一个对象或一个数组来说都是一样的。

几乎 ArrayObject 之上添加的唯一东西是 .length 属性,以及一些特定于数组的方法,例如 .push .确实如此,在引擎盖下 Array 只是 Object。真正使它可用作数组的是 .length 参数;它允许您以 有序 方式使用 for (i = 0; i < arr.length; i++) 循环 迭代 属性。 .length 属性 会在您 .push() 将新元素添加到数组中或执行其他一些特定于数组的操作时更新。这就是使对象作为索引的有序列表工作所需的全部内容。