2013-03-28 43 views
10

爲什麼使用arguments這樣的錯誤?在node.js中使用參數時,對象沒有方法「減少」錯誤?

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

sum(1,2,3,4); 

錯誤:

/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 

這是Crockford的先生JS lectures

回答

27

arguments不是一個真正的數組,它是一個「類似數組」的對象,並且reduce不是類似數組的對象的方法。你可以通過arguments的背景下,這樣的使用reduce

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

}); 

編輯:於此間舉行的MDN陣列狀物體更多信息。

+0

數組和「類似數組」的對象之間有什麼區別? –

+3

@AndersonGreen One從'Array'繼承它的原型,包括像'reduce'這樣的好東西。其他人沒有,但仍然有數字指標,這使得它們與陣列相似。 –

+0

@AndersonGreen:檢查我的編輯,在MDN上有一些有用的信息,滾動直到找到「類似數組」的標題。 – elclanrs

0

您收到錯誤消息,因爲arguments是一個對象而不是列表。考慮以下幾點:

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

arguments的MDN JavaScript的文檔有更多的信息,包括:

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

1

克羅克福德明確規定,對參數使用數組方法,比如減少()年推出的ECMAscript 5.在ECMAscript5之前,甚至Array在所有Javascript實現中都沒有reduce()。對於像map()和reduce()這樣的東西,我推薦使用像Underscore這樣的庫來隱藏實現差異。

相關問題