2011-01-28 14 views
8

यह पता लगाने का सबसे अच्छा तरीका क्या है कि कोई चर स्ट्रिंग है या नहीं (और, वैसे ही, एक संख्या, एक बूलियन इत्यादि)?एक चर के प्रकार की जांच

आमतौर पर आप पाएँगे:

function isString(value) { 
    return typeof value === 'string'; 
} 

लेकिन लोग भूल जाते हैं कि एक भी सीधे var foo = new String("bar"); का उपयोग कर वस्तुओं स्ट्रिंग बना सकते हैं - कि एक अच्छा विचार है या नहीं एक बिल्कुल अलग बात है या नहीं।

तो यहां जाने का तरीका क्या है? मैं के बारे में सोच सकते हैं - और देखा है - विभिन्न दृष्टिकोण (कुछ सरलीकृत):

// option 1 
function isString(value) { 
    return (typeof value === 'string') || 
      /^function String\(\)/.test(value.constructor + ''); 
} 

या

// option 2 
function isString(value) { 
    return (typeof value === 'string') || 
      (value.constructor === String); 
} 

या

// option 3 
function isString(value) { 
    return (typeof value === 'string') || 
      value instanceof String; 
} 

वहाँ एक "सर्वश्रेष्ठ" जिस तरह से इस बारे में जाने के लिए है ? या वे सभी समकक्ष हैं?

उत्तर

5

तीन मौजूदा विकल्पों में से पहला मुझे पहले हैकी लगता है क्योंकि यह value.constructor के स्ट्रिंग प्रस्तुति का परीक्षण करने के लिए नियमित अभिव्यक्ति का उपयोग करता है। यह काम करता है, लेकिन यह अभी भी हैकी लगता है (शायद यह सिर्फ मुझे है)।

दूसरा विकल्प ही, स्ट्रिंग शाब्दिक, मौजूदा वस्तुओं और new String() निर्माता के साथ किए गए वस्तुओं श्रृंखलाबद्ध से बनाए गए तार के लिए काम जबकि तीसरा विकल्प new String() निर्माता या किसी अन्य उद्देश्य यह है कि String()से विरासत के साथ किए गए वस्तुओं के साथ काम करना चाहिए होगा (मुझे जावास्क्रिप्ट विरासत के बारे में निश्चित नहीं है; क्या कोई इसकी पुष्टि कर सकता है?)

constructor संपत्ति प्राइमेटिव/शाब्दिक के लिए भी मौजूद है, न केवल new का उपयोग करके बनाई गई रैपर ऑब्जेक्ट्स।

function isString(value) { 
    return value.constructor === String; 
} 

alert(isString("test1"));    // true 
alert(isString(new String("test2"))); // true 

हालांकि, तीसरे विकल्प के विपरीत यह String() कि String() से विरासत के अलावा अन्य निर्माताओं के साथ वस्तुओं के साथ काम नहीं कर सकता: यह दूसरा विकल्प काफी बेमानी में typeof जांच करता है।

मेरा जवाब एक उदाहरण के रूप तार का उपयोग करता है सवाल प्रतिबिंबित करने के लिए, लेकिन एक ही विचार Number, Boolean, Function, Object, Array और अन्य प्रकार के लिए लागू होता है।

+0

नीट, मुझे नहीं पता था (कम से कम मैंने कभी इसके बारे में सोचा नहीं;) वास्तव में सवाल का जवाब नहीं देता है, हालांकि। – n3rd

+0

@ n3rd: यह तीन मौजूदा विकल्पों में से एक नहीं होने के अलावा अन्य प्रश्न का उत्तर कैसे नहीं देता है? – BoltClock

+0

+1। बस इसे पोस्ट करने वाला था। क्या यह स्ट्रिंग के पकड़ (गैसपी) उप-वर्गों को यद्यपि करता है? – Skurmedel

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