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数组元素是否通过看不见的编号数组对象属性进行引用访问?
编辑似乎是这样:为什么使用";对于在";数组迭代是个坏主意吗?
Array
在Object
上添加的几乎只有.length
属性和一些特定于数组的方法,如.push
。确实如此,在引擎盖下,Array
只是Object
。真正使其可用作数组的是所说的.length
参数;它允许您使用for (i = 0; i < arr.length; i++)
循环以有序的方式迭代属性。.length
属性在将10个新元素.push()
添加到数组中或执行其他特定于数组的操作时更新。这就是使对象作为索引、有序列表工作所需要的全部内容。
要使访问器值成为数组中的索引,它应该:
- 为非负整数(
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。
数组是对象,最简单的方法是返回true
的[] instanceof Object
。
是的,数组元素的访问方式与Object属性的访问方式相同。
删除对象的属性时,实际上是将该属性设置为未定义,因此对象或数组也是如此。
相关文章:
- 如何从对象的原型方法访问JavaScript对象属性
- 如何将数组项添加到对象属性中
- 设置嵌套对象属性的更好方法
- JavaScript管理具有重复属性名称的对象属性
- 如何使用element.myobj.prop等具有对象属性的元素
- 如何使用(this)访问Angular 2 http rxjs catch函数中的对象属性
- Es6:能够在设置/更新/删除对象属性时调用自定义方法
- 如何在AngularJS工厂中正确声明对象属性
- 如何使用object.assign()从其他对象引用基本对象属性
- 使用XPath样式访问Javascript JSON对象属性
- 将javascript对象(属性+值)合并到一个对象中
- 数组:使对象属性成为数组键
- 无法从JavaScript中的函数调用对象属性
- Google Closure Advanced |无法识别对象属性|动态属性
- Javascript从匿名函数访问外部对象属性
- 从函数更改对象属性
- 如何从字符串变量访问对象属性
- 从嵌套对象属性中获取排除某个值的最高值
- 在Aurelia computeds中,当设置依赖关系时,如何声明对对象属性的依赖关系
- 传递数量不确定的可能嵌套的对象属性