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

JavaScript数组元素仅仅是数组对象属性吗?,javascript,arrays,object,properties,element,Javascript,Arrays,Object,Properties,Element,我观察到以下情况: 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]); // al

我观察到以下情况:

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.)
*/
此外:

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

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

编辑
似乎是这样的:

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

  • 是非负整数(
    0
    1
    100
    200
  • 如果转换为数字(从
    字符串
    ),则应为非负整数('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
属性会自动更新。
长度应始终比最高索引大1。

要使存取器值成为数组中的索引,它应:

  • 是非负整数(
    0
    1
    100
    200
  • 如果转换为数字(从
    字符串
    ),则应为非负整数('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
属性会自动更新。
长度
应始终比最高索引大1。

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

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


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

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

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


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

几乎
数组在
对象上添加的唯一内容是
.length
属性和一些特定于数组的方法,如
.push
。就是这样,引擎盖下的
数组
只是一个
对象
。真正使其可用作数组的是
.length
参数;它允许您使用
for(i=0;i
循环以有序方式迭代属性。
.length
属性在
.push()
新元素进入数组或执行其他特定于数组的操作时更新。这就是使对象作为索引有序列表工作所需的一切。

几乎一个
数组
对象
上添加的唯一内容就是
.length
属性和一些特定于数组的方法,如
.push
。就是这样,引擎盖下的
数组
只是一个
对象
。真正使其可用作数组的是
.length
参数;它允许您使用
for(i=0;i
循环以有序方式迭代属性。
.length
属性在
.push()
新元素进入数组或执行其他特定于数组的操作时更新。这就是让一个对象作为一个索引、有序的列表工作所需要的一切。

但是“作为索引处理”是什么意思?索引属性和其他属性之间有什么区别?可能是@deceze在他的answer@Nonorios“作为索引处理”意味着设置一个值将根据最高索引增加
长度。设置常规属性时,
长度
不会自动更新。但“作为索引处理”是什么意思?索引属性和其他属性之间有什么区别?可能是@deceze在他的answer@Nonorios“作为索引处理”意味着设置一个值将根据最高索引增加
长度。设置常规属性时,
长度
不会自动更新。