与其他编程语言相比,JavaScript 中的数组非常独特,而且它也有其全部的怪癖。
包括这个:
// Making a normal array.
var normalArray = [];
normalArray.length = 0;
normalArray.push(1);
normalArray[1] = 2;
normalArray; // returns [1, 2]
normalArray.length // returns 2
所以,是的,上面就是我们都知道的如何创建数组并用元素填充它们,对吧? (暂时忽略 normalArray.length = 0
部分)
但是为什么当相同的序列应用于一个不纯粹是数组的对象时,它看起来有点不同,并且它的 length
属性有点偏离?
// Making an object that inherits from the array prototype (i.e.: custom array)
var customArray = new (function MyArray() {
this.__proto__ = Object.create(Array.prototype);
return this
});
customArray.length = 0;
customArray.push(1);
customArray[1] = 2;
customArray; // returns [1, 1: 2]
customArray.length // returns 1
不完全确定这里发生了什么,但我们将非常感谢一些解释。
最佳答案
这可能不是完美的答案,但根据我对 Javascript 数组的理解,它们与通常的对象有点不同。 (主要是因为它维护了长度属性,而对象则没有)。
因此,如果我们以您的代码为例:
var normalArray = [];
这是在 Javascript 中创建数组的正确方法。但下面这个呢?
var customArray = new (function MyArray() {
this.__proto__ = Object.create(Array.prototype);
return this
});
它们一样吗?让我们看看..
Array.isArray(normalArray); // true -> [object Array]
Array.isArray(customArray); // false -> [object Object]
所以很明显,虽然你继承了数组原型(prototype),但它并没有真正创建一个 Array
类型的对象。它只是创建一个普通的 JS 对象,但具有继承的数组函数。这就是为什么当您使用 customArray.push(1);
设置值时它会更新长度的原因。
但是由于您的 customArray
只是一个常规对象,并且对于常规 JS 对象,使用 []
表示法来设置属性,因此它不会更新长度(因为对象
没有length
属性)
希望很清楚:)
关于javascript - 奇怪的数组对象 - JavaScript,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52049724/