2013-03-28 44 views
10

Tại sao tôi gặp lỗi khi sử dụng arguments như thế này?Đối tượng không có phương pháp 'giảm' lỗi khi sử dụng đối số trong node.js?

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

sum(1,2,3,4); 

lỗi:

/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 

Đây là từ ông Crockford JS lectures.

Trả lời

27

arguments không phải là mảng thực, đó là đối tượng "giống mảng" và reduce không phải là phương thức của đối tượng giống mảng. Bạn có thể sử dụng reduce bằng cách thông qua arguments như bối cảnh, như thế này:

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

}); 

Edit: hơn thông tin về mảng giống như đối tượng ở đây tại MDN.

+0

Sự khác biệt giữa mảng và đối tượng "giống mảng" là gì? –

+3

@AndersonGreen One thừa hưởng nguyên mẫu của nó từ 'Mảng', bao gồm các tính năng như' giảm'. Những người khác thì không, nhưng vẫn có các chỉ số số, làm cho chúng giống với các mảng. –

+0

@AndersonGreen: Kiểm tra chỉnh sửa của tôi, có một số thông tin hữu ích tại MDN, cuộn cho đến khi bạn tìm thấy tiêu đề "giống mảng". – elclanrs

0

Bạn gặp lỗi vì arguments là một đối tượng không phải là danh sách. Hãy xem xét những điều sau đây:

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

Các tài liệu MDN JavaScript cho arguments có thêm thông tin, bao gồm:

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

1

Crockford tuyên bố rõ ràng rằng việc sử dụng các phương pháp mảng như giảm() trên đối số được giới thiệu vào ECMAscript 5. Trước khi ECMAscript5, thậm chí không Array đã giảm() trong tất cả các triển khai Javascript. Đối với những thứ như map() và reduce(), tôi khuyên bạn nên sử dụng một thư viện như Underscore để ẩn các khác biệt thực hiện.

Các vấn đề liên quan