Reputation: 117
So I have created an empty array in Javascript
const x = Array(5);
Or
const x = new Array(5);
And if i check the length, Its 5
in both the cases but when I loop over it using .map
then it did not give me the indices i.e 0,1,2,3,4
x.map((el, i) => i);
This should return [0,1,2,3,4]
Upvotes: 1
Views: 222
Reputation: 370699
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..
Upvotes: 2