JavaScript Array元素只是Array对象属性吗?

时间:2016-04-01 10:54:29

标签: 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]); // 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?

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

要在数组中将访问者值设为索引,它应该:

  • 是一个非负整数(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。

答案 2 :(得分:0)

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

是的,Array元素的引用方式与Object属性相同。

当您删除Object的属性时,实际上是将此属性设置为undefined,因此对于对象或数组它是相同的。