请参阅此代码:
var arr = [];
arr.foo = 'bar';
console.log(arr.foo);
现在,我们看到arr.foo
没有抛出错误并且有效,但从技术上讲它应该抛出错误,为什么不呢?
另外,上面的内容如何在内存中表示,考虑到数组块主要是在连续位置分配内存和索引的偏移量,这是如何工作的?
答案 0 :(得分:3)
......技术上它应该抛出错误......
不,它的工作完全如the specification中所述。
它起作用是因为standard JavaScript arrays aren't really arrays,*它们只是由Array.prototype
支持的对象,具有特殊的length
属性,并且对array indexes的属性名称进行特殊处理。规格。具有任何其他名称的属性只是普通的对象属性,而不是数组条目。
由于数组是对象,因此它们可以具有非数组条目属性,就像任何其他对象一样。
FWIW,数组索引的定义是:
整数索引是一个字符串值属性键,它是一个规范数字字符串(见7.1.16),其数值为+0或正整数≤2 53 -1。 数组索引是整数索引,其数值i在+0≤i<1的范围内。 2 32 -1。
请注意typed arrays是真正的数组;但它们也是对象,你也可以为它们添加非数组输入属性。
* (这是我贫血的小博客上的帖子)