参见以下代码:
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是真实的数组;但它们也是对象,您也可以向它们添加非数组输入属性。
*(这是我贫乏的小博客上的帖子)