के रूप में सभी मामलों में इरादा यह काम नहीं करता है ... समस्या यह है कि .toString
एक स्ट्रिंग लौटने की उम्मीद है है, इसलिए प्रदान की कार्यान्वयन में स्ट्रिंग के तरीकों, काम नहीं करेगा, ई। जी। sum(2)(3).split()
एक त्रुटि का कारण होगा।
हालांकि हम मान सकते हैं कि sum()
परिणाम हमेशा एक संख्या होने की उम्मीद की जाएगी, यह कुछ मामलों में सच नहीं हो सकता है और डीबग करना मुश्किल हो सकता है, ई। जी। मैंने इस मुद्दे को देखा जब मैं शुरुआत में .toString
के साथ jsbin.com पर लिखा गया कोड परीक्षण कर रहा था (यह आंतरिक रूप से console.log तर्क पर split
करता है, इसे ओवरराइड करता है)।
इसके बजाय, .toString
return String(result);
जैसा दिखना चाहिए। अच्छी बात यह है कि .toString
(जब .valueOf
या आधुनिक Symbol.toPrimitive
नहीं है) प्राइमेटिव रूपांतरण को संभालेगा, इसलिए संख्या की उम्मीद करने वाला कोड भी काम करेगा। यहां संभावित समस्या "डबल" रूपांतरण हो सकती है।
बेहतर समाधान शायद .toString
और .valueOf
या केवल Symbol.toPrimitive
की जोड़ी का उपयोग करने के लिए हो सकता है यदि आप केवल आधुनिक ब्राउज़र को लक्षित कर रहे हैं।
उदाहरण Symbol.toPrimitive
का उपयोग कर:
function sum(a) {
let result = a;
function f(b) {
result += b;
return f;
}
f[Symbol.toPrimitive] = hint => hint === 'string' ? String(result) : result;
return f;
}
उदाहरण .toString
और .valueOf
जोड़ी का उपयोग कर।
function sum(a) {
var result = a;
function f(b) {
result += b;
return f;
}
// avoiding double conversion which will happen in case of .toString
f.valueOf = function() { return result; };
f.toString = function() { return String(result); };
return f;
}
स्रोत
2017-09-30 15:54:43
मूल रूप से पहली चेतावनी राशि (1) (2) में जो एक और बी है और दूसरी चेतावनी में यह योग (6) (- 1) (2) अब कार्य समझता है कि (2) भी एफ (बी) है) तर्क। – PCA
@ बाबू ए और बी की सोच से छुटकारा पाएं। आप 'sum() 'को एक बार बुलाया जा सकता है,' var sum' शुरू करना और फिर पहली कॉल के बाद ओवर्रिडन प्राप्त करना, 'एफ (बी)' का आह्वान करके प्रत्येक कॉल को संभालना (क्योंकि स्वयं प्रत्येक बार स्वयं लौटता है, इस प्रकार स्वयं जिससे आगे चेनिंग करना संभव हो जाता है) फ़ंक्शन जब तक एक स्ट्रिंग संदर्भ नहीं होता है। अब स्पष्ट है? – Christoph
महान स्पष्टीकरण। क्या आप कृपया मुझे f.toString के बजाय बता सकते हैं क्या आप सीधे राशि वापस करने के लिए मुझे कोड दिखा सकते हैं। समारोह राशि (अ) { वर योग = एक समारोह च (ख) { योग + = ख वापसी राशि } // f.toString = function() {वापसी राशि} वापसी एफ } योग (1) (2); – PCA