2013-03-28 2 views
10

Warum erhalte ich einen Fehler, wenn ich arguments so verwende?Object hat keine Methode 'reduce' Fehler bei der Verwendung von Argumenten in node.js?

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

sum(1,2,3,4); 

Fehler:

/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 

Dies ist von Herrn Crockford JS lectures.

Antwort

27

arguments ist kein echtes Array, es ist ein "array-like" -Objekt und reduce ist keine Methode array-ähnlicher Objekte. Sie können, indem arguments als Kontext verwenden reduce, wie folgt aus:

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

}); 

Edit: weitere Informationen über Array-ähnliche Objekte hier am MDN.

+0

Was ist der Unterschied zwischen einem Array und einem Array-ähnlichen Objekt? –

+3

@AndersonGreen Man erbt seinen Prototyp von 'Array', einschließlich Goodies wie' reduce'. Die anderen nicht, aber immer noch numerische Indizes, die sie Arrays ähneln. –

+0

@AndersonGreen: Überprüfen Sie meine Bearbeitung, es gibt einige nützliche Informationen an der MDN, scrollen Sie, bis Sie die "Array-artige" Überschrift finden. – elclanrs

0

Sie erhalten einen Fehler, weil arguments ein Objekt ist keine Liste. Beachten Sie Folgendes:

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

Die MDN JavaScript-Dokumentation arguments weitere Informationen, zB:

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

1

Crockford heißt es ausdrücklich, dass die Verwendung von Array-Methoden wie verringern() auf Argumente eingeführt wurde ECMAscript 5. Vor ECMAscript5 hatte nicht einmal Array in allen Javascript-Implementierungen reduce(). Für Dinge wie map() und reduce() empfehle ich eine Bibliothek wie Underscore, die die Implementierungsunterschiede verbirgt.

Verwandte Themen