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

why do I get an error doing something 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.

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.

You get an error because arguments is an object not a list. Consider the following:

> function a(){ return arguments; }
> b = a(1, 2, 3);
> b
{ '0': 1,
  '1': 2,
  '2': 3 }

The MDN JavaScript documentation for arguments has more information, including:

An Array-like object corresponding to the arguments passed to a function.

Crockford explicitly states that using Array methods such as reduce() on arguments was introduced in ECMAscript 5. Before ECMAscript5, not even Array had reduce() in all Javascript implementations. For things like map() and reduce(), I recommend using a library like Underscore which hides the implementation differences.