जावास्क्रिप्ट में स्ट्रिंग समानता के लिए जाँच करने का सही तरीका क्या है?


841

जावास्क्रिप्ट में स्ट्रिंग्स के बीच समानता की जांच करने का सही तरीका क्या है?


2
क्या == का उपयोग न करने का कोई कारण है?
केंड्रिक

21
@ केंड्रिक - निश्चित। यह टाइप-कॉर्शन सिस्टम अविश्वसनीय रूप से अनइंस्टिट्यूट हो सकता है और त्रुटियों को अनदेखा करने में बहुत आसान बना सकता है (यह सही लगता है, लेकिन बहुत गलत हो सकता है)
STW

20
@ केंड्रिक - क्योंकि {} == "[object Object]"सच का मूल्यांकन करता है, उदाहरण के लिए।
चेतन शास्त्री

12
String().equals()जेएस में एक तरीका नहीं है कि कुछ कष्टप्रद ...
अलेक्जेंडर मिल्स

2
@AlexanderMills क्यों?
Ry-

जवाबों:


623

हमेशा जब तक आप==और===ऑपरेटरोंके उपयोग के अंतर और निहितार्थ को पूरी तरह से नहीं समझते हैं, तब तकऑपरेटर का उपयोग करें===क्योंकि यह आपको अस्पष्ट (गैर-स्पष्ट) बग और डब्ल्यूटीएफ से बचाएगा। ==आंतरिकरूप से "नियमित"ऑपरेटर के प्रकार-जबरदस्ती के कारण बहुत अप्रत्याशित परिणाम हो सकते हैं, इसलिए===हमेशा अनुशंसित दृष्टिकोणका उपयोगकरना होता है।

इस अंतर्दृष्टि के लिए, और जावास्क्रिप्ट के अन्य "अच्छे बनाम बुरे" भागों को श्री डगलस क्रॉकफोर्ड और उनके काम पर पढ़ा गया। एक महान Google टेक टॉक है जहां वह बहुत सारी अच्छी जानकारी को सारांशित करता है: http://www.youtube.com/watch?v=hQVTIJBZook


अपडेट करें:

काइल सिम्पसन द्वारा द यू डॉन्ट नो जेएस सीरीज़ उत्कृष्ट है (और ऑनलाइन पढ़ने के लिए स्वतंत्र है)। श्रृंखला भाषा के आम तौर पर गलतफहमी वाले क्षेत्रों में जाती है और "खराब भागों" की व्याख्या करती है जो कि क्रॉकफोर्ड ने आपको बचने का सुझाव दिया है। उन्हें समझकर आप उनका सही उपयोग कर सकते हैं और नुकसान से बच सकते हैं।

" अप एंड गोइंग " पुस्तक में समानता पर एक खंड शामिल है , जिसमें इस विशिष्ट सारांश के साथ कि ढीले ( ==) बनाम सख्त ( ===) का उपयोग कैसे किया जाए :

कुछ सरल takeaways के लिए कई विवरणों को उबालने के लिए, और यह जानने में मदद करें कि क्या उपयोग करना है ==या ===विभिन्न स्थितियों में, यहाँ मेरे सरल नियम हैं:

  • यदि तुलना में मूल्य (उर्फ पक्ष) trueया falseमूल्य हो सकता है , तो बचें ==और उपयोग करें ===
  • एक तुलना में या तो मूल्य इन विशिष्ट मूल्यों (की हो सकता है 0, ""या [], से बचने के - खाली सरणी) ==और उपयोग ===
  • में सभी अन्य मामलों, आप सुरक्षित उपयोग करने के लिए ==। न केवल यह सुरक्षित है, बल्कि कई मामलों में यह आपके कोड को इस तरह से सरल बनाता है जिससे पठनीयता में सुधार होता है।

मैं अभी भी डेवलपर्स के लिए क्रॉकफोर्ड की बात की सिफारिश करता हूं जो वास्तव में जावास्क्रिप्ट को समझने के लिए समय का निवेश नहीं करना चाहते हैं - यह एक डेवलपर के लिए अच्छी सलाह है जो केवल कभी-कभी जावास्क्रिप्ट में काम करता है।


7
यह आवश्यक नहीं है जब आप सुनिश्चित करें कि दोनों ऑपरेंड स्ट्रिंग हैं, उदाहरण के लिए, उपयोग करते समयif (typeof foo == "string")
मार्सेल कोरपेल

25
@ मार्सेल - आप सही हैं, लेकिन यह हमेशा=== ऑपरेटर का उपयोग करने के लिए बहुत बेहतर है और कभी भी "मैं वास्तव में, पूरी तरह से, 100% निश्चित है कि ==यह कैसे व्यवहार करेगा कि मुझे लगता है कि यह होगा?"
STW

7
@STW - एक उदाहरण कि क्रॉकफोर्ड अल्फा और जावास्क्रिप्ट के ओमेगा क्यों नहीं हैं, क्या उनकी सलाह है कि वे वेतन वृद्धि / कमी ( ++/ --) का उपयोग न करें ।
मार्सेल कोर्पेल

10
और का उपयोग कभी नहीं ++या --या एक पंक्ति if/elseबयान या continueया newऑपरेटर या पूरी तरह से वैध कोड प्रथाओं के किसी अन्य संख्या कि Crockford समझा गया है "हानिकारक"। और निश्चित रूप से कभी भी उपयोग के बारे में सोचने पर भी विचार नहीं करते हैं evalया withयहां तक ​​कि अगर उनके नुकसान अच्छी तरह से समझे जाते हैं। और क्या आपने जेएस का अगला संस्करण देखा है? स्ट्रिकटर सिंटैक्स और कुछ मुट्ठी भर सहायक, कुछ जो सालों से तैर रहे हैं, इन सभी के बारे में हमें इस समय के बाद मिलता है। वाक्य-विन्यास बिल्कुल विकसित नहीं हुआ है। अगर क्रॉकफोर्ड इसके पीछे है, तो यह एक बुरी बात है।
मूूगू

4
@ कॉफ़ी एडिक्ट - JSFiddle में एक त्वरित परीक्षण असहमति प्रकट करता है। वे दोनों केस-संवेदी हैं: jsfiddle.net/st2EU
STW

203

यदि आप जानते हैं कि वे तार हैं, तो प्रकार की जाँच करने की कोई आवश्यकता नहीं है।

"a" == "b"

हालांकि, ध्यान दें कि स्ट्रिंग ऑब्जेक्ट्स समान नहीं होंगे।

new String("a") == new String("a")

झूठा लौटेगा।

स्ट्रिंग ऑब्जेक्ट के लिए एक आदिम में कनवर्ट करने के लिए valueOf () विधि को कॉल करें,

new String("a").valueOf() == new String("a").valueOf()

सच हो जाएगा


4
उस JSS के लिए धन्यवाद, दो स्ट्रिंग ऑब्जेक्ट्स कभी भी बराबर नहीं होंगे जब तक कि वे मूल्य की परवाह किए बिना एक ही वस्तु नहीं हैं।
अनुराग

4
@ जेएसएस: इसके अतिरिक्त, new String("a") == "a"सच है (लेकिन साथ नहीं होगा ===), क्योंकि बाएं हाथ की तरफ एक आदिम स्ट्रिंग मूल्य में परिवर्तित हो जाएगा।
मैथ्यू क्रुमले

5
@JSS: new String("a") == new String("a"), new String("a") === new String("b"), new String("a") === new String("a")होगा सभी वापसी false, जब से तुम की वस्तुओं के संदर्भ के साथ काम कर रहे Stringवर्ग, नहीं प्रकार के पुरातन string
पाल्विस

4
इसे पढ़ने वाले किसी के लिए भी स्पष्ट करें। new String(foo)एक स्ट्रिंग ऑब्जेक्ट बनाता है , और फू को एक स्ट्रिंग आदिम में String(foo) परिवर्तित करता है
ब्रिगैंड

9
@FakeRainBrigand - कीचड़ के रूप में स्पष्ट है, लेकिन इसके बारे में क्या javascripts है, है ना?
पेरियाटा ब्रीटा

58

जवाब देने के लिए बस एक जोड़: यदि ये सभी तरीके झूठे हैं, भले ही तार बराबर लग रहे हों, यह संभव है कि एक स्ट्रिंग के बाईं और दाईं ओर एक व्हाट्सएप हो। इसलिए, .trim()तुलना करने से पहले तार के अंत में बस रखें :

if(s1.trim() === s2.trim())
{
    // your code
}

मैंने यह जानने की कोशिश में घंटों खो दिए कि क्या गलत है। आशा है कि यह किसी की मदद करेगा!


1
बहुत बहुत धन्यवाद। हालांकि यह मेरे लिए अजीब है, क्योंकि मैंने सुनिश्चित किया कि बाएं या दाएं कोई व्हाट्सएप नहीं था और फिर भी यह मेरी समस्या को हल करने का एकमात्र तरीका था। शायद यह एक स्ट्रिंग के आंतरिक प्रतिनिधित्व से संबंधित है?
निको

2
धन्यवाद @akelec !! @ नीको, यह शून्य-चौड़ाई-अंतरिक्ष चरित्र के कारण होने की संभावना थी जो नग्न आंखों के लिए अदृश्य है। En.wikipedia.org/wiki/Zero-width_space देखें । भले ही इस चरित्र के अपने उद्देश्य हैं, कई डेवलपर्स इसके अस्तित्व को नाराज करते हैं!
stwr667

धन्यवाद कि मेरे में समानता की जांच के बाद से निराशा हो रही थी अगर अभी तक असफल हो रहा था तो मैंने डिबगिंग का निरीक्षण करते समय कोई व्हाट्सएप नहीं देखा।
ड्रेजाउंड्स

पाठ फ़ाइल से एक चर लोड करते समय एक आम समस्या (अर्थात: उपयोग करना fetch)। बहुत बहुत धन्यवाद।
सोलापाजो डी एरियेरेज़

@SopalajodeArrierez, वास्तव में, स्ट्रिंग के अंत में एक जगह या एक गाड़ी है। आपका स्वागत है।
अकलेक

22

क्या मुझे इस सवाल का नेतृत्व किया है paddingऔरwhite-spaces

मेरे मामले की जाँच करें

 if (title === "LastName")
      doSomething();

और शीर्षक था " LastName"

यहां छवि विवरण दर्ज करें

तो शायद आपको trimइस तरह से फंक्शन का उपयोग करना होगा

var title = $(this).text().trim();

2
धन्यवाद यहाँ मैं .toString().trim()टाइपस्क्रिप्ट में इस्तेमाल किया
Akitha_MJ

17

जब तक आप वास्तव में नहीं जानते हैं कि ज़बरदस्ती कैसे काम करती है, आपको इसके बजाय ==पहचान ऑपरेटर से बचना चाहिए और उसका उपयोग करना चाहिए ===लेकिन आपको यह समझने के लिए इसे पढ़ना चाहिए कि यह कैसे काम करता है

यदि आप उपयोग ==करते हैं, तो आप उदाहरण के लिए भाषा को किसी प्रकार का ज़बरदस्ती करने देते हैं, उदाहरण के लिए:

"1" == 1 // true
"0" == false // true
[] == false // true

डगलस क्रॉकफोर्ड ने अपनी पुस्तक में कहा:

पहचान ऑपरेटर का उपयोग करना हमेशा बेहतर होता है।


3
हालांकि यह लिंक प्रश्न का उत्तर दे सकता है, लेकिन उत्तर के आवश्यक भागों को शामिल करना और संदर्भ के लिए लिंक प्रदान करना बेहतर है। लिंक-केवल उत्तर अमान्य हो सकते हैं यदि लिंक किए गए पृष्ठ बदल जाते हैं।
प्रकाश कुमार

{}==" "मुझे Unexpected token ==यह करने का सही तरीका क्या है?
बशीर अल-मोमानी

12

वास्तव में दो तरीके हैं जिनसे स्ट्रिंग को जावास्क्रिप्ट में बनाया जा सकता है।

  1. var str = 'Javascript'; यह एक आदिम स्ट्रिंग मान बनाता है।

  2. var obj = new String('Javascript');यह एक आवरण प्रकार की वस्तु बनाता है String

    typeof str // string
    typeof obj // object

तो समानता की जांच करने का सबसे अच्छा तरीका ===ऑपरेटर का उपयोग करना है क्योंकि यह मूल्य और साथ ही दोनों ऑपरेंड के प्रकार की जांच करता है।

यदि आप दो वस्तुओं के बीच समानता की जांच करना चाहते हैं तो String.prototype.valueOfसही तरीका है।

new String('javascript').valueOf() == new String('javascript').valueOf()

6

ट्रिक Objectsका उपयोग करके स्ट्रिंग को चेक किया जा सकता है JSON.stringyfy()

var me = new String("me");
var you = new String("me");
var isEquel = JSON.stringify(me) === JSON.stringify(you);
console.log(isEquel);


1

यह देखते हुए कि दोनों तार बहुत बड़े हो सकते हैं, 2 मुख्य दृष्टिकोण हैं bitwise searchऔरlocaleCompare

मैंने इस समारोह को फिर से शुरू किया

function compareLargeStrings(a,b){
    if (a.length !== b.length) {
         return false;
    }
    return a.localeCompare(b) === 0;
}

-2

ऐसा करने का सबसे आसान तरीका यह है कि एक टर्नरी ऑपरेटर का उपयोग करें:

 "was" == "was" ? true : false

लेकिन यदि आप जिस स्ट्रिंग की तुलना करना चाहते हैं वह एक सरणी में है, तो आप es6 फ़िल्टर का उपयोग करेंगे

let stringArray  = ["men", "boys", "girls", "sit", "can", "gotten"]
stringArray.filter(I=> I === boys ? 
stringArray.pop(indexOf(I)) : null)

उपरोक्त आपके स्ट्रिंग की जांच करेगा और जो भी स्ट्रिंग उसे सरणी से मेल खाता है जो हमारे मामले में हमने "लड़कों" को चुना था


-8

मैं परीक्षण के दौरान एक वैकल्पिक समाधान के साथ आया था। आप स्ट्रिंग प्रोटोटाइप पर फ़ंक्शन का उपयोग कर सकते हैं।

String.prototype.betwenStr = function(one){

return JSON.stringify(new String(this)) === JSON.stringify(new String(one));

}


 //call it
 "hello world".betweenStr("hello world"); //returns boolean 
 //value

क्रोम ब्राउज़र में ठीक काम करता है


प्रश्न पूछता है कि कैसे जांचा जाए कि "हैलो वर्ल्ड" = "हैलो वर्ल्ड", न कि कैसे जांचें कि क्या "हैलो वर्ल्ड" एक स्ट्रिंग है।
निक

4
यह सिर्फ मूर्खतापूर्ण है। आपने का Rube Goldberg संस्करण बनाया है ==
जे जे जे

ओपी, आपका संपादन अपने आध्यात्मिक भाग में पूरी तरह से अलग है, और आपके उत्तर को पहले ही बहुत अधिक डाउनवोट मिल चुका है। मैं आपसे आग्रह करता हूं कि कृपया इस उत्तर को हटा दें और अपने संपादित संस्करण के साथ एक नया पोस्ट करें
Yılmaz Durmaz
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.