2013-03-28 12 views
10

Perché viene visualizzato un errore quando si utilizza arguments in questo modo?L'oggetto non ha il metodo 'reduce' errore quando si usano gli argomenti in node.js?

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

sum(1,2,3,4); 

errore:

/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 

Questo è dal signor Crockford di JS lectures.

risposta

27

arguments non è un array reale, è un oggetto "array-like" e reduce non è un metodo di oggetti tipo array. È possibile utilizzare reduce passando arguments come contesto, in questo modo:

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

}); 

Edit: più informazioni oggetti array simile qui al MDN.

+0

Qual è la differenza tra un array e un oggetto "array"? –

+3

@AndersonGreen One eredita il suo prototipo da 'Array', inclusi elementi come' reduce'. Gli altri no, ma hanno ancora indici numerici, che li rendono simili agli array. –

+0

@AndersonGreen: Controlla la mia modifica, ci sono alcune informazioni utili su MDN, scorri fino a trovare l'intestazione "array-like". – elclanrs

0

Si ottiene un errore perché arguments è un oggetto non un elenco. Si consideri il seguente:

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

La documentazione MDN JavaScript per arguments ha più informazioni, tra cui:

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

1

Crockford afferma esplicitamente che utilizzano metodi di array, come ridurre() su argomenti è stato introdotto nel ECMAscript 5. Prima di ECMAscript5, nemmeno Array aveva riduci() in tutte le implementazioni di Javascript. Per cose come map() e reduce(), ti consiglio di usare una libreria come Underscore che nasconde le differenze di implementazione.

Problemi correlati