【问题标题】:Are JavaScript Array elements nothing more than Array object properties?JavaScript Array 元素只不过是 Array 对象属性吗?
【发布时间】:2016-07-21 03:38:47
【问题描述】:

我观察到以下情况:

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?

【问题讨论】:

    标签: javascript arrays object properties element


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      • 为非负整数(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。

      【讨论】:

      • 但是“视为索引”是什么意思?索引属性和另一个属性之间有什么区别?可能是@deceze 在他的回答中所说的
      • @Nonorios “视为索引”意味着设置一个值将基于最高索引增加length。设置常规属性时,length 不会自动更新。
      【解决方案3】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-01-20
        • 1970-01-01
        • 2018-03-18
        • 1970-01-01
        • 1970-01-01
        • 2015-08-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多