Object has no method ‘reduce’ error when using arguments in node.js?

Object has no method ‘reduce’ error when using arguments in node.js?

Problem

Why do I get an error when using arguments like this?

function sum(){
    return arguments.reduce(function(a,b){
        console.log(a+b)
        return a+b;
    },0);
}

sum(1,2,3,4);

error:

/Users/bob/Documents/Code/Node/hello.js:2
return arguments.reduce(function(a,b){
                 ^
TypeError: Object #<Object> has no method 'reduce'
    at sum (/Users/bob/Documents/Code/Node/hello.js:2:19)
    at Object.<anonymous> (/Users/bob/Documents/Code/Node/hello.js:8:1)
    at Module._compile (module.js:456:26)
    at Object.Module._extensions..js (module.js:474:10)
    at Module.load (module.js:356:32)
    at Function.Module._load (module.js:312:12)
    at Function.Module.runMain (module.js:497:10)
    at startup (node.js:119:16)
    at node.js:903:3

This is from Mr. Crockford’s JS lectures.

Problem courtesy of: doorfly

Solution

arguments is not a real array, it’s an “array-like” object and reduce is not a method of array-like objects. You can use reduce by passing arguments as context, like this:

[].reduce.call(arguments, function(a, b) {

});

Edit: more info on array-like objects here at the MDN.

Solution courtesy of: elclanrs

Discussion

Leave a Reply

Your email address will not be published. Required fields are marked *