2009-03-07 6 views
24

मैंने हमेशा सोचा है कि जावास्क्रिप्ट के पास अपनी विधियों को संख्या देने के बजाय वैश्विक गणित वस्तु क्यों है। क्या इसके लिए कोई अच्छा कारण है?जावास्क्रिप्ट और मैथ ऑब्जेक्ट में विस्तार संख्या.प्रोटोटाइप?

भी कुछ इस तरह कर रही है के लिए किसी भी कमियां (दक्षता के अलावा अन्य) देखते हैं ?:

Number.prototype.round = function(){ 
    return Math.round(this); 
}; 

बस स्पष्ट करना, मैं समझता हूँ कि π तरह स्थिरांक कहीं जरूरत है और कार्यों कि एक से अधिक पर लागू होते हैं न्यूनतम/अधिकतम की तरह संख्या। सवाल मुख्य रूप से उन विधियों से संबंधित था जो केवल एक ही संख्या जैसे दौर, पेट, पाप, पाउ इत्यादि को प्रभावित करते हैं

उत्तर

16

Math ऑब्जेक्ट का कारण सरल है: "क्योंकि जावा इसे करता है"। कारणों का सबसे अच्छा नहीं है, लेकिन यहां हम हैं। मुझे लगता है कि डगलस क्रॉकफोर्ड ने आधा भाषा * दबाने के लिए अपना अभियान शुरू करने से पहले चीजों को और अधिक समझ में डाल दिया। मूल रूप से आप "की अनुमति" थे, या मतलब, इस तरह काम करने के लिए:

with (Math) { 
    var n = min(round(a) * round(b), sqrt(c)); 
    var result = exp(n + d); 
} 

दोष Number.prototype का विस्तार करने के लिए कि किसी और ही बात कर सकता है। या बदतर, उदाहरण के लिए, को सममित राउंडिंग फ़ंक्शन के रूप में परिभाषित करें।

यदि आप अपने जीवन को आसान बनाने के तरीकों की तलाश में हैं, तो वहां क्यों रुकें? क्यों वैश्विक कार्यों के रूप में Math कार्यों को शामिल नहीं करते?

var m = 'abs acos asin atan atan2 ceil cos exp floor log max min ' + 
     'pow random round sin sqrt tan PI').split(' '); 
for (var i=0,l=m.length; i<l; i++) { 
    window[ m[i] ] = Math[ m[i] ]; 
} 

यह सभी गणित कार्यों को वैश्विक दायरे में छोड़ देगा, प्रभावी रूप से आपको "गणित" टाइप करना बंद कर देगा। अपने आप से पूछें: क्या Number को विस्तारित करने और इन कार्यों के साथ window विस्तार करने के बीच कोई वास्तविक अंतर है?

* इससे पहले कि आप मुझे ज्वाला दें: क्रॉकफोर्ड टिप्पणी गंभीरता से लेने के लिए नहीं है। मैं उनके साथ सहमत हूं कि with एक अंतर्निहित वैश्विक पर्यावरण में बहुत खतरनाक है।

1

मुझे लगता है कि गणित संख्या विधियों के सेट से अधिक है। यह व्यापक उपयोग है। कहें, NumberVariable.PI का उपयोग भ्रमित कर सकते हैं। यादृच्छिक संख्या पीढ़ी के साथ ही।

मुझे लगता है कि विस्तारित संख्या ठीक है, क्योंकि यह जेएस प्रकृति का हिस्सा है। अगर मैं यहां गलत हूं तो शायद कोई मुझे सही करेगा।

+0

आप काफी कुछ भी लेकिन सरणी वस्तु का विस्तार कर सकते कर सकते हैं। यह ऐरे ऑब्जेक्ट है जहां विस्तार करना परेशान होता है क्योंकि आप इसके लिए सिमपेल नहीं कर सकते हैं ..in लूप (हाँ मुझे पता है कि आप एक के लिए उपयोग कर सकते हैं() लेकिन यह सिर्फ इतना बदसूरत दिखता है। –

+3

@Pim Jager: आपको नहीं होना चाहिए किसी भी तरह से ... के लिए उपयोग करना - यह वस्तुओं के लिए है। यही कारण है कि * असली * नो-नो ऑब्जेक्ट.प्रोटोटाइप का विस्तार कर रहा है ... – Shog9

+2

यदि आपका जावास्क्रिप्ट संस्करण ऑब्जेक्ट.डेफिनप्रॉपर्टी का समर्थन करता है तो आप विस्तार कर सकते हैं। विकल्प विकल्प है : झूठी – dresende

18

अन्य लोगों को भ्रमित करने के बाद Number.prototype विस्तार करने में कोई कमी नहीं है। क्या बात है? Math.round(value) के बजाय value.round() का उपयोग करने में बेहतर क्या है?

  1. यह भी गैर संख्या के लिए काम करता है:: जब मान एक स्ट्रिंग (उदाहरण के लिए है, जबकि value.round()Math.round("5") काम करता है काम नहीं करेगा, एक का मूल्य

    वहाँ Math वस्तु के लिए कई अच्छे कारण हैं टेक्स्टबॉक्स)

  2. गणित वस्तु के कुछ सदस्य Math.min() या Math.max() जैसे "प्राथमिक" संख्या मान से संबंधित नहीं हैं। या आप इसे a.max(b) जैसे उपयोग करना चाहते हैं?
  3. अन्य सदस्य वैश्विक हैं और एक विशेष संख्या से संबंधित नहीं हैं। उदाहरण Math.PI या फ़ंक्शन Math.random() जैसे स्थिरांक हैं।
+0

अच्छा अवलोकन, +1। मैं सोच रहा हूं कि क्यों डगलस क्रॉकफोर्ड ने जावा से मैथ ऑब्जेक्ट उधार लेने पर जावास्क्रिप्ट को गलती की। –

+0

@ फ़र्डिनेंड: मैं कभी भी "ए.मैक्स (5" जैसी किसी भी चीज़ का उपयोग करने की योजना नहीं बना रहा था। ') "। कुछ कार्य और स्थिरांक गणित वस्तु में हैं (मैं इसे स्पष्ट करने के लिए अपनी पोस्ट अपडेट करूंगा)। जो लोग अकेले नंबर पर लागू होते हैं, वे मुझे पसंद करते हैं। कि आप तारों का उपयोग कर सकते हैं हालांकि एक अच्छा बिंदु है। – Annan

+0

प्रदर्शन विचार भी हैं - मूल्य। कुछ भी मुक्केबाजी के मूल्य की आवश्यकता है - उदाहरण के लिए। एक वस्तु में मूल्य परिवर्तित करना। (कभी-कभी इसे टालना संभव है, लेकिन आपके संभावित उपयोग मामलों में से कोई भी नहीं) – olliej

12

123.round();

आपका JavaScript कंसोल कर अपनी आँखें करने के लिए त्रुटियों के कुछ सौ फेंक होगा प्रयास:, पी नाह ...

आप कर सकते हैं:

Number.prototype.x तो: (123).x(); लेकिन कभी 123.x();

+2

मैंने हमेशा सोचा है कि आप 123.method() क्यों नहीं कर सके। मुझे पता है कि फ्लोट की वजह से इसे अनुमति देना आसान नहीं है, हालांकि मुझे लगता है कि रूबी सिंटैक्स की अनुमति देता है और यह सबकुछ आसान बना देगा! – Annan

+14

सरल: 123..round() – dresende

+6

हां, या तो '123..round()' या '(123) .round()' काम करेगा। '123..round() === 123.0.round()' – sam

1

मुझे विश्वास है कि इसे इस तरह से कॉल करना भी काम करता है, क्योंकि संख्या के प्रोटोटाइप फ़ंक्शन हर दूसरे ऑब्जेक्ट के प्रोटोटाइप फ़ंक्शंस की तरह काम करते हैं:

5.5["round"](); 
//should return 6 
1

तो, यह एक अच्छा विचार है या नहीं, इस पर वार्तालाप, आप यह ठीक कर सकते हैं।

आप क्या कर सकते हैं 123.x(), लेकिन जे एस के लिए दुभाषिया टूट गया है

अजीब तरह से (के रूप में यह संदेश प्रेषण के रूप में डॉट की व्याख्या नहीं करता है), तो आप 123 .x() (साथ उपयोग कर सकते हैं एक संख्या और बिंदु के बीच की जगह) इसके बजाय, और यह काम करेगा।

123..also लेकिन यह काम करता है क्योंकि आप प्रभावी रूप से एक दशमलव बनाया है और फिर इसे

(typeof 123) === 'संख्या') // सच

को भेजने है

आज़माएं:

संख्या.प्रोटोटाइप.times = फ़ंक्शन (अन्य) {इसे वापस * अन्य}; 3। टाइम्स (5);

कंसोल में।

0

इस पर मेरा विचार यह है कि यदि आप मूल कार्यक्षमता को ओवरराइट नहीं करते हैं, मूल नामकरण मानकों को समझने के साथ उचित जांच करते हैं और यह आपके कोड को और अधिक पठनीय और प्रबंधनीय बनाता है, तो अपना कोड आरामदायक और सुविधाजनक बनाएं।

if (Number.prototype.round == null) 
    Number.prototype.round = function() { return Math.round(this); } 

जावास्क्रिप्ट की प्रकृति की वजह से इस का उपयोग करते हुए, के लिए के रूप में, मेरा मानना ​​है कि ऐसा करने के लिए सबसे अच्छा तरीका है द्वारा:

  • एक सरल स्थिर मान के बजाय एक चर में नंबर रैपिंग (अधिकांश अक्सर मामला)
    • nNum.round();
  • कोष्ठक में सरल स्थिर मूल्य रैपिंग:
    • (123) .round();
  • का उपयोग कर वर्ग कोष्ठक अंकन
    • 123 [ "दौर"] कॉल।फोन();
संबंधित मुद्दे