JavaScript数组元素只不过是数组对象属性

Are JavaScript Array elements nothing more than Array object properties?

本文关键字:对象 属性 数组 只不过是 数组元素 JavaScript      更新时间:2023-10-21

我观察到以下情况:

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数组元素是否通过看不见的编号数组对象属性进行引用访问?

编辑似乎是这样:为什么使用";对于在";数组迭代是个坏主意吗?

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

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

  • 为非负整数(01100200
  • 如果转换为数字(来自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。

数组是对象,最简单的方法是返回true[] instanceof Object

是的,数组元素的访问方式与Object属性的访问方式相同。

删除对象的属性时,实际上是将该属性设置为未定义,因此对象或数组也是如此。