2013-03-28 15 views
10

arguments kullanırken neden böyle hatalar alıyorum?node.js'de argümanlar kullanıldığında, nesnenin "azaltma" hatası yok mu?

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

sum(1,2,3,4); 

hatası:

/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 

Bu Bay Crockford en JS lectures değil.

cevap

27

arguments bir "dizi benzeri" nesnesi ve reduce dizi benzeri nesneler için bir yöntem değildir, gerçek bir dizi değildir. Böyle, bağlam olarak arguments geçirerek reduce kullanabilirsiniz:

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

}); 

Düzenleme: Burada MDN de dizi benzeri nesneler üzerinde fazla bilgi. arguments bir nesne değil, bir liste olduğu için

+0

Bir dizi ve "dizi benzeri" bir nesne arasındaki fark nedir? –

+3

@AndersonGreen One, prototipini "Array" dan, "küçült" gibi güzellikler de dahil olmak üzere devralır. Diğerleri yok, ama hala dizilere benzeyen sayısal indeksleri var. –

+0

@AndersonGreen: Düzenlememi kontrol et, MDN'de bazı yararlı bilgiler var, "dizi gibi" başlığını bulana kadar kaydır. – elclanrs

0

Sen bir hata alıyorum. Aşağıdaki ele alalım:

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

arguments için MDN JavaScript belgelerine dahil daha fazla bilgi var

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

1

Crockford açıkça argümanlar böyle (azaltacak şekilde kullanarak Dizi yöntemleri) tanıtıldı belirtiyor ECMAscript 5. ECMAscript5'ten önce, Dizi bile tüm Javascript uygulamalarında küçültme() içermiyordu. Map() ve reduce() gibi şeyler için, uygulama farklılıklarını gizleyen, Underscore gibi bir kitaplık kullanmanızı öneririm.