Because the specification requires that when an array is created like that with the Array constructor, where values
is the argument list:
a. Let len be values[0].
b. Let array be ! ArrayCreate(0, proto).
c. If Type(len) is not Number, then
i. Perform ! CreateDataPropertyOrThrow(array, "0", len).
ii. Let intLen be 1.
d. Else,
i. Let intLen be ! ToUint32(len).
ii. If SameValueZero(intLen, len) is false, throw a RangeError exception.
e. Perform ! Set(array, "length", intLen, true).
f. Return array.
That's all it does, and nothing else. In short, it creates a new array object inheriting from Array.prototype
, and then sets a length
property on it. It doesn't create any numeric indicies on the array.
It's like
const createArray = (length) => {
const newArr = Object.create(Array.prototype);
newArr.length = length;
return newArr;
};
const arr = createArray(5);
console.log(arr.length);
console.log(arr.hasOwnProperty('0'));
As a result, if you want to iterate over the array, you'll have to fill it first somehow - either with .fill
, Array.from
, or spreading it into a new array..