- ordered set of values, indexed collection
- special objects with dynamic length property, constructor is
Array
- indexes are just integer property names, starting from
0
, can add other properties like with any object
- can access integer property names only using bracket notation since integers are not valid identifiers, e.g.
arr[5]
- length property returns largest integer property plus 1, i.e. other properties don’t count against length
- values can be of any data type, arrays grow / shrink dynamically without bounds since just object, i.e. not “out of bound” error
- beware: arrays are not linear allocations of memory like in other languages, objects that are made to look like it, i.e. not fast at all ❗️
- object is “array-like” when it has a length property and indexed elements, it lacks all methods of
Array.prototype
like forEach()
, push()
, etc.
Creating arrays
- array literal:
[element0, element1]
- array constructor:
new Array(element0, element1)
, if argument single integer creates array with that length and all values undefined
- see
Array.of()
and Array.from()
later
Array elements
- doesn’t need to assign to indexes in ascending order, can just assign to any property like object
const arr = ["Hello", "World"];
arr[42] = "Illuminati";
- any non-integer element becomes a typical property name as string
arr[3.5] = 1010;
console.log(arr["3.5"])
- length property returns last index plus 1, computed internally
console.log(arr.length);
- increasing the length property does not expand the array, just increases length property
beware: accessing non-existing elements returns undefined
even though they do not exist at all, they are not just undefined
❗️
- decreasing the length property truncates array, all higher indexes are deleted
- using delete on an array item doesn’t update the
length
property of the array, use Array.prototype.splice()
instead
Array iteration
for loop 👎
for (let i = 0; i < arr.length; i++) {
statements;
}
- loops over all indices of an array
- does not skip non-existing elements, since
i
increases until length property ❗️
for…in loop 👎
for…of loop 👍
for (const item of arr) {
statements;
}
- loops over all indexed elements of an array
- does not skip non-existing elements, i.e. like a for loop ❗️
Array.prototype.forEach()
👎
arr.forEach((currentElement, i) => {...});
- for each element calls a function with element, index and optional parameters as argument
- skips non-existing elements
- ignores return value of callback function
- returns itself
undefined
Array
object type
Properties
Array.from()
: creates new array from iterable or array-like object
Array.isArray()
: checks if argument is array, fix for broken typeof
operator
Array.of()
: creates new array from arguments
Prototype properties
Array.prototype.concat()
: joins array(s) to back of existing
Array.prototype.join()
: joins elements of array to string using separator
Array.prototype.push()
: adds element(s) to end of array, returns new length
Array.prototype.unshift()
: adds element(s) to front of array, returns new length
Array.prototype.pop()
: removes last element from array, returns this element
Array.prototype.shift()
: removes first element from array, returns this element
Array.prototype.slice()
: returns section of array
Array.prototype.splice()
: replaces / removes section from array, returns section
Array.prototype.reverse()
: returns reversed array
Array.prototype.sort()
: returns sorted array, can specify sort function
Array.prototype.includes()
: returns true
if array contains element, else false
(with ES2016)
Array.prototype.indexOf()
: returns index of first matching element
Array.prototype.lastIndexOf()
: returns index of last matching element
Array.prototype.find()
: returns first element for which calling the function returned true
Array.prototype.findIndex()
: returns index of first element for which calling the function returned true
Array.prototype.forEach()
: calls a function for each element
Array.prototype.map()
: returns array with results from calling a function for each element
Array.prototype.filter()
: returns array with all elements for which calling the function returned true
Array.prototype.every()
: returns true
if function returned true
for each element
Array.prototype.some()
: returns true
if function returned true
for at least one element
Array.prototype.reduce()
: combines elements by recursively calling a function from left-to-right with previous result as argument
Array.prototype.rightReduce()
: reduce from right-to-left
Array.prototype.flat()
: returns flattened array up to the specified depth (with ES2019)
Resources