यदि जावास्क्रिप्ट में एक स्ट्रिंग है, तो मैं कैसे जांच सकता हूं?


182

यदि जावास्क्रिप्ट में एक स्ट्रिंग है, तो मैं कैसे जांच सकता हूं?

मैंने यह कोशिश की है और यह काम नहीं करता है ...

var a_string = "Hello, I'm a string.";

if (a_string typeof 'string') {
    // this is a string
}

जवाबों:


381

आप करीब थे:

if (typeof a_string === 'string') {
    // this is a string
}

संबंधित नोट पर: उपरोक्त चेक काम नहीं करेगा यदि एक स्ट्रिंग बनाई जाती है new String('hello')जैसे कि Objectइसके बजाय टाइप किया जाएगा । इस के आसपास काम करने के लिए जटिल समाधान हैं, लेकिन यह सिर्फ उस तरह से तार बनाने से बचने के लिए बेहतर है, कभी।


1
दोस्तों, मैं वास्तव में आप दोनों को एक स्वीकृत उत्तर दूंगा, लेकिन मैं ऐसा नहीं कर सकता, मैं कर सकता हूँ दोनों को +1 है, स्वीकार किए गए जवाब देने की तुलना में, जो मेरी विशिष्ट समस्या के अधिक निकट है, कि मैं नहीं हूं पूरी तरह से समझाया।
विट्टो

यह मेरे लिए काम कियाif(typeof(str) === typeof(String()))
स्कॉट मर्फी

78

typeofऑपरेटर एक इन्फ़िक्स (ताकि आपके उदाहरण के एलएचएस मतलब नहीं है) नहीं है।

आपको इसका उपयोग करने की आवश्यकता है ...

if (typeof a_string == 'string') {
    // This is a string.
}

याद रखें, typeofएक ऑपरेटर है, एक फ़ंक्शन नहीं है। इसके बावजूद, आप typeof(var)जंगली में बहुत उपयोग किया जा रहा देखेंगे । यह उतना ही समझ में आता है var a = 4 + (1)

इसके अलावा, आप ==दोनों ऑपरेंड String( typeof हमेशा रिटर्न ) के बाद से (समानता तुलना ऑपरेटर) का भी उपयोग कर सकते हैं String, जावास्क्रिप्ट को उन्हीं चरणों को निष्पादित करने के लिए परिभाषित किया गया है जिनका मैंने उपयोग किया था ===(सख्त तुलना ऑपरेटर)।

के रूप में Box9 का उल्लेख है , इस का पता नहीं लगा होगा एक instantiated Stringवस्तु।

आप उसके साथ का पता लगा सकते हैं ...।

var isString = str instanceof String;

jsFiddle

... या ...

var isString = str.constructor == String;

jsFiddle

परंतु यह एक बहु windowपरिवेश में काम नहीं करेगा (सोचें iframe)।

आप इसके साथ मिल सकते हैं ...

var isString = Object.prototype.toString.call(str) == '[object String]';

jsFiddle

लेकिन फिर, (जैसा कि Box9 उल्लेख है ), आप शाब्दिक Stringप्रारूप का उपयोग करके बेहतर हैं , उदाvar str = 'I am a string';

आगे पढ़ना


1
@ Box9 कोई चिंता नहीं, मैं वैसे भी छाया हुआ हूं: P
एलेक्स

@alex मैं अब भी हूँ: ओ (10 और मिनट!)
डेविड तांग

3
जब आप 24 घंटे की अवधि के लिए अधिकतम प्रतिनिधि प्राप्त कर चुके होते हैं तो @RobG प्रतिनिधि कैप किया जाता है। उसके बाद, upvotes आपकी प्रतिष्ठा की ओर नहीं गिनता है।
एलेक्स

क्या यह जांचना संभव नहीं है कि क्या एक चर केवल सदस्य की उपस्थिति के लिए परीक्षण करके एक स्ट्रिंग है? उदाहरण के लिए if(myVar.toUpperCase) alert('I am a string');:? देखें: jsfiddle.net/tb3t4nsx
ingredient_15939

1
@ संघटक_15939 यह वास्तव में एक अच्छा तरीका नहीं है ... क्योंकि{ toUpperCase: '' }
एलेक्स

14

पिछले उत्तरों को संयोजित करने से ये समाधान मिलते हैं:

if (typeof str == 'string' || str instanceof String)

या

Object.prototype.toString.call(str) == '[object String]'

4

निम्नलिखित अभिव्यक्ति सही है :

'qwe'.constructor === String

निम्नलिखित अभिव्यक्ति सही है :

typeof 'qwe' === 'string'

निम्नलिखित अभिव्यक्ति झूठी है (सिक!):

typeof new String('qwe') === 'string'

निम्नलिखित अभिव्यक्ति सही है :

typeof new String('qwe').valueOf() === 'string'

सबसे अच्छा और सही तरीका ( imho ):

if (someVariable.constructor === String) {
   ...
}

1

अब दिन मुझे लगता है कि यह टाइपोफ () के एक फ़ंक्शन रूप का उपयोग करना पसंद करता है ...

if(filename === undefined || typeof(filename) !== "string" || filename === "") {
   console.log("no filename aborted.");
   return;
}

का कोई कार्य रूप नहीं है typeof, आप केवल उन कोष्ठकों के साथ संचालन के क्रम को नियंत्रित कर रहे हैं। कुछ लोगों को कुछ परिस्थितियों में यह अधिक पठनीय लग सकता है।
जॉन जेड

@ जॉन्ज "संचालन के आदेश को नियंत्रित करने" से आपका क्या मतलब है? धन्यवाद।
a20

मुझे लगता है कि बाद में मुझे एहसास हुआ कि आप कंस्ट्रक्टर की जांच कर सकते हैं और इसे पसंद कर सकते हैं क्योंकि जैसा कि मैंने सोचा था कि यह तेजी से होगा लेकिन यह तेज नहीं है? उदाहरण संख्या 4 यहाँ कोष्ठक का उपयोग कर दिखाती है। developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… यह विचार करने के लिए संकलक पार्सिंग के लिए निश्चित रूप से अधिक पठनीय और कम है। 'ऑर्डर' पर मेरा अनुमान संभवतः एक गति मुद्दा है या इस बात से संबंधित है कि कंपाइलर तर्क स्टैक को कैसे लोड करता है, मुझे यकीन नहीं है।
मास्टर जेम्स

1
@ a20 ऑर्डर ऑफ़ ऑपरेशन्स उस ऑर्डर का वर्णन करता है जिसमें ऑपरेशंस को कई ऑपरेशंस वाले स्टेटमेंट्स के लिए निष्पादित किया जाता है। देखें डेवलपर. mozilla.org/en-US/docs/Web/JavaScript/Reference/… - कोष्ठक (ऑपरेटिंग समूह) में सबसे अधिक ऑपरेटर पूर्वता है और इसलिए पहले उनका मूल्यांकन किया जाता है। इस मामले में, filenameकेवल चारों ओर के कोष्ठक एक एकल कथन का समूह बनाते हैं, और इसलिए बेकार और बहिष्कृत होते हैं। यह अच्छी बात है कि इस उत्तर में 0 का स्कोर है क्योंकि यह गलत, भ्रामक और अनपेक्षित है; बेहतर होगा कि इसका नकारात्मक अंक हो।
जॉन जेड

लिंक के लिए बहुत जानकारीपूर्ण धन्यवाद। तो कोष्ठक की जाँच की और पहले चला रहे हैं? ताकि कोष्ठक के बिना उर्फ ​​कॉलिंग के अन्य तरीकों के लिए अगले जांच के बिना तुरंत भाग जाना चाहिए, जो बाद में और धीमा हो जाएगा? नहीं? क्या मैं वहाँ रनटाइम संकलक के बारे में नहीं समझ रहा हूँ।
मास्टर जेम्स

0

सभी मामलों में अशक्त या अपरिभाषित की जाँच करें

if (a_string && typeof a_string === 'string') {
    // this is a string and it is not null or undefined.
}

typeof nullऔर typeof undefinedकभी नहीं लौटेगा 'string', इतना typeof a_stringही काफी है। नेक्रोपोस्टिंग के लिए क्षमा करें
इवान फ्रोलोव

-3

मेरा व्यक्तिगत दृष्टिकोण, जो सभी मामलों के लिए काम करता है, सदस्यों की उपस्थिति के लिए परीक्षण कर रहा है जो सभी केवल तार के लिए मौजूद होंगे।

function isString(x) {
    return (typeof x == 'string' || typeof x == 'object' && x.toUpperCase && x.substr && x.charAt && x.trim && x.replace ? true : false);
}

देखें: http://jsfiddle.net/x75uy0o6/

मैं जानना चाहता हूं कि क्या इस पद्धति में खामियां हैं, लेकिन इसने मुझे वर्षों तक अच्छी सेवा दी है।


2
यह किसी भी पुरानी वस्तु द्वारा आसानी से मूर्ख बना दिया जाता है जिसमें वे विधियाँ होती हैं।
एलेक्स

8
इसे डक-टाइपिंग कहा जाता है - जैसे अगर यह एक स्ट्रिंग की तरह चलता है और यह एक स्ट्रिंग की तरह बात करता है, तो यह एक स्ट्रिंग भी हो सकता है। आप थोड़ा पागल हैं अगर आपको लगता है कि यह एक स्ट्रिंग का परीक्षण करने का सबसे अच्छा तरीका है, लेकिन जावास्क्रिप्ट एक थंडरडोम है, तो आप करते हैं।
जॉन जेड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.