2013-03-28 6 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

@ एंडरसनग्रीन वन 'एरे' से अपने प्रोटोटाइप को विरासत में मिला है, जिसमें 'कम' जैसी उपहार शामिल हैं। दूसरों को नहीं, लेकिन अभी भी संख्यात्मक सूचकांक हैं, जो उन्हें सरणी जैसा दिखता है। –

+0

@AndersonGreen: मेरे संपादन की जांच करें, एमडीएन पर कुछ उपयोगी जानकारी है, जब तक आपको "सरणी जैसी" शीर्षक नहीं मिल जाती तब तक स्क्रॉल करें। – elclanrs

0

आपको एक त्रुटि मिलती है क्योंकि arguments कोई ऑब्जेक्ट नहीं है। पर विचार करें निम्नलिखित:

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

arguments के लिए MDN जावास्क्रिप्ट प्रलेखन सहित अधिक जानकारी के होते हैं:

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

1

Crockford स्पष्ट रूप से कहा गया है कि बहस पर) इस तरह के कम करने (के रूप में सरणी तरीकों का उपयोग कर में पेश किया गया था ईसीएमएस्क्रिप्ट 5. ईसीएमएस्क्रिप्ट 5 से पहले, सभी जावास्क्रिप्ट कार्यान्वयन में ऐरे ने भी कम नहीं किया था()। मानचित्र() और कम() को कम करने के लिए, मैं अंडरस्कोर जैसी लाइब्रेरी का उपयोग करने की अनुशंसा करता हूं जो कार्यान्वयन अंतर को छुपाता है।

संबंधित मुद्दे