参见以下代码:



var arr = [];
arr.foo = 'bar';
console.log(arr.foo);





现在,我们看到arr.foo不会引发错误并且可以工作,但是从技术上讲它应该引发错误,所以为什么不呢?

此外,以上内容如何在内存中表示,考虑到数组块大多是在连续位置分配了带有偏移索引的内存,这在这里如何工作?

最佳答案

从技术上讲它应该抛出一个错误


不,它完全按照the specification中的描述工作。

之所以起作用,是因为standard JavaScript arrays aren't really arrays *只是由Array.prototype支持的对象,具有特殊的length属性和对根据规范属于array indexes的属性名称的特殊处理。具有任何其他名称的属性只是普通的对象属性,而不是数组条目。

由于数组是对象,因此它们可以具有非数组输入属性,就像其他任何对象一样。

FWIW,数组索引的定义是:


  整数索引是一个字符串值的属性键,它是规范的数字字符串(请参见7.1.16),其数值为+0或正整数≤253-1。数组索引是整数索引,其数值i在+0≤i

注意typed arrays是真实的数组;但它们也是对象,您也可以向它们添加非数组输入属性。



*(这是我贫乏的小博客上的帖子)

09-25 17:57
查看更多