2011-01-18 8 views
37

new Number() और Number() के बीच क्या अंतर है? मुझे लगता है कि new Number()Number ऑब्जेक्ट बनाता है और Number() केवल एक फ़ंक्शन है, लेकिन मुझे कब कॉल करना चाहिए, और क्यों?नया नंबर() बनाम संख्या()

एक संबंधित नोट पर, मोज़िला का कहना है:

Do not use a Boolean object to convert a non-boolean value to a boolean value. Instead, use Boolean as a function to perform this task. 

x = Boolean(expression);  // preferred 
x = new Boolean(expression); // don't use 

कि क्यों है? मैंने सोचा कि परिणाम वही थे?

उत्तर

40

Boolean(expression) बस, एक बूलियन आदिम मूल्य में अभिव्यक्ति कन्वर्ट जबकि new Boolean(expression) एक आवरण वस्तु परिवर्तित बूलियन मान के आसपास पैदा करेगा होगा।

अंतर इस के साथ देखा जा सकता है:

// Note I'm using strict-equals 
new Boolean("true") === true; // false 
Boolean("true") === true; // true 

और यह भी इस (धन्यवाद @hobbs) के साथ:

typeof new Boolean("true"); // "object" 
typeof Boolean("true"); // "boolean" 

नोट: आवरण वस्तु परिवर्तित हो जाएगा जबकि आवश्यक होने पर स्वचालित रूप से आदिम (और इसके विपरीत), केवल एक ही मामला है जिसके बारे में मैं सोच सकता हूं कि आप new Boolean, या किसी भी ओथ का उपयोग करना चाहते हैं प्राइमेटिव्स के लिए आर रैपर - यदि आप गुणों को एक ही मान में संलग्न करना चाहते हैं। E.g:

+3

और 'टाइपोफ (बूलियन ("सत्य")) === "बूलियन" ', जबकि' टाइपऑफ (नया बूलियन (" सत्य ")) ===" ऑब्जेक्ट "'। – hobbs

+4

"जब आवश्यक हो तो रैपर ऑब्जेक्ट स्वचालित रूप से आदिम में परिवर्तित हो जाएगा" यह सच है, लेकिन कुछ हद तक भ्रामक है। ऑब्जेक्ट्स ('बूलियन' ऑब्जेक्ट्स सहित) हमेशा बूलियन संदर्भ में 'सत्य' का मूल्यांकन करते हैं: 'यदि (नया बूलियन (0)) {अलर्ट ("ओह, 0 सत्य है।"); } '। "अपेक्षित" मान प्राप्त करने के लिए, 'valueOf'' पर कॉल करें: 'नया बूलियन (0) .valueOf() === झूठा' –

25
new Number(x) 

एक नया रैपर ऑब्जेक्ट बनाता है। मुझे नहीं लगता कि इसका कभी भी उपयोग करने का एक वैध कारण है।

Number(x) 

उत्तीर्ण तर्क को संख्या मान में परिवर्तित करता है। आप कुछ चर को संख्या प्रकार में डालने के लिए इसका उपयोग कर सकते हैं।

+x 

आम तौर पर:

आप उन की जरूरत नहीं है:

Number(value) 
String(value) 
Boolean(value) 
:

new Number() 
new String() 
new Boolean() 

आप कास्टिंग के लिए उन का उपयोग कर सकते लेकिन यह एक ही काम किया हो जाता है

हालांकि, कलाकारों के लिए सरल समाधान हैं ing:

+x // cast to Number 
'' + x // cast to String 
!!x // cast to Boolean 
+12

आपके shorthands _simpler_ हो सकते हैं, लेकिन वे वही काम करने के लिए संख्या/स्ट्रिंग/बूलियन फ़ंक्शंस का उपयोग करने के रूप में स्पष्ट नहीं हैं। – Nigel

+3

@ निगेल ट्रू, लेकिन जावास्क्रिप्ट प्रोग्रामर के बीच, संख्या दबाव के लिए '+' उपसर्ग सामान्य है और (जो मैं देख सकता हूं) पसंदीदा है। –

14

परामर्श the spec; धारा 15.7.1 से:

Number एक समारोह के रूप के बजाय एक निर्माता के रूप में बुलाया है, यह एक प्रकार रूपांतरण प्रदर्शन करती है।

इसी तरह, एक समारोह (15.6 के रूप में Boolean का उपयोग कर।1):

जब बूलियन को कन्स्ट्रक्टर के बजाए फ़ंक्शन के रूप में बुलाया जाता है, तो यह एक प्रकार का रूपांतरण करता है।

... जिसका अर्थ है कि आप धारा 9.2 ("ToBoolean") से परामर्श:

सार आपरेशन ToBoolean तालिका 11 के अनुसार प्रकार बूलियन के एक मूल्य के लिए अपने तर्क धर्मान्तरित:
Undefined = false
Null = false
Boolean = परिणाम इनपुट तर्क (कोई रूपांतरण नहीं) के बराबर होता है।
Number = यदि तर्क +0, -0, या NaN है तो परिणाम गलत है; अन्यथा परिणाम सच है।
String = परिणाम गलत है अगर तर्क खाली स्ट्रिंग है (इसकी लंबाई शून्य है); अन्यथा परिणाम सच है।
Object = true

new Boolean(value) और Boolean(value) के बीच अंतर मूल रूप से है कि पूर्व रिटर्न एक वस्तु, लेकिन बाद रिटर्न ऊपर प्रति एक आदिम। यह मायने रखती है, क्योंकि वस्तुओं truthy हैं:

var b = new Boolean(false); 

display(b);   // Displays "false" 
if (b) { 
    display("true");  // This is the path that gets taken, displaying "true" 
} 
else { 
    display("false"); // This path does NOT get taken 
} 

Live example ... जबकि आप लगभग हमेशा उन्हें परीक्षण के लिए बूलियन्स चाहते हैं।

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