Problem
You want to convert the array-like object arguments to a real array.
Ingredients
- the 
Arrayprototype - the 
slice()method - the 
call()method 
Directions
- 
Given: a function that takes different parameters and accesses them via the
argumentsobject.function printAllArguments() { let values = arguments; for(let i=0; i<values.length; i++) { console.log(values[i]); } } printAllArguments(2, 3, 4); 
- 
Get a reference to the
Arrayprototype.function printAllArguments() { let arrayPrototype = Array.prototype; ... } ... - 
Get a reference to the
slice()method. (Theslice()method creates a shallow copy of a part of an array and returns a new array. If you omit any parameters it copies the whole array.)function printAllArguments() { let arrayPrototype = Array.prototype; let sliceMethod = arrayPrototype.slice; ... } ... - 
Call the
slice()method using thecall()method.function printAllArguments() { let arrayPrototype = Array.prototype; let sliceMethod = arrayPrototype.slice; let values = sliceMethod.call(arguments); for(let i=0; i<values.length; i++) { console.log(values[i]); } } printAllArguments(2, 3, 4); - 
Combine the code from the previous three steps.
function printAllArguments() { let values = Array.prototype.slice.call(arguments); for(let i=0; i<values.length; i++) { console.log(values[i]); } } printAllArguments(2, 3, 4); - 
Voilá, there you got a real array now, e.g., you can call array methods like
forEach,map,reduceandfilteron it.function printAllArguments() { let values = Array.prototype.slice.call(arguments); values.forEach(function(value) { console.log(value); }); } printAllArguments(2, 3, 4); 
Notes
- This recipe is also known as method borrowing.
 
Alternative recipes
- 
Since ES2015: use
Array.from()to create an array based on an array-like object:function printAllArguments() { let values = Array.from(arguments); values.forEach(function(value) { console.log(value); }); } printAllArguments(2, 3, 4); - 
And while you are in ES2015 you can also use fat arrow functions:
function printAllArguments() { let values = Array.from(arguments); values.forEach((value) => { console.log(value); }); } printAllArguments(2, 3, 4); - 
And while you are at it, use rest parameters, which are real arrays:
function printAllArguments(...values) { values.forEach((value) => { console.log(value); }); } printAllArguments(2, 3, 4);