জাভাস্ক্রিপ্টে স্ট্রিং সমতার জন্য যাচাই করার সঠিক উপায় কী?


841

জাভাস্ক্রিপ্টে স্ট্রিংসের মধ্যে সমতা রক্ষার সঠিক উপায় কী?


2
== ব্যবহার না করার কোন কারণ আছে কি?
কেন্ড্রিক

21
@ কেন্ড্রিক - নিশ্চিত এটি টাইপ-জবরদস্তি সিস্টেমটি অবিশ্বাস্যরূপে অপ্রচলিত হতে পারে এবং ত্রুটিগুলি উপেক্ষা করা খুব সহজ করে তুলতে পারে (এটি সঠিক দেখাচ্ছে তবে খুব ভুল হতে পারে)
STW

20
@ কেন্ড্রিক - কারণ {} == "[object Object]"সত্য হিসাবে মূল্যায়ন করে।
চেতন সাস্ট্রি

12
কিছুটা বিরক্তিকর যা String().equals()
আলেকজান্ডার মিলস

2
@ আলেকজান্ডারমিলস কেন?
রাই-

উত্তর:


623

সর্বদা যতক্ষণ না আপনিঅপারেটরগুলি==এবং===অপারেটরগুলিব্যবহারের প্রভাবগুলি পুরোপুরি বুঝতে পারছেন ততক্ষণঅপারেটরটি ব্যবহার করুন===কারণ এটি আপনাকে অস্পষ্ট (স্পষ্টত নয়) বাগ এবং ডাব্লুটিএফ থেকে রক্ষা করবে। ==অভ্যন্তরীণভাবে টাইপ-জোরের কারণে"নিয়মিত"অপারেটরের খুব অপ্রত্যাশিত ফলাফল হতে পারে, তাই ব্যবহার===করা সর্বদা প্রস্তাবিত পদ্ধতির হয়।

এটিকে অন্তর্দৃষ্টি দেওয়ার জন্য এবং জাভাস্ক্রিপ্টের অন্যান্য "ভাল বনাম খারাপ" অংশগুলি মিঃ ডগলাস ক্রকফোর্ড এবং তাঁর কাজ সম্পর্কে পড়েছেন। একটি দুর্দান্ত গুগল টেক টক রয়েছে যেখানে তিনি প্রচুর ভাল তথ্যের সংক্ষিপ্তসার করেছেন: http://www.youtube.com/watch?v=hQVTIJBZook


হালনাগাদ:

আপনাকে যা করতে জানেন জাতীয় কাইলি সিম্পসন দ্বারা সিরিজ চমৎকার (এবং অনলাইন পড়তে বিনামূল্যে) হয়। সিরিজটি ভাষার সাধারণভাবে ভুল বোঝাবুঝি অঞ্চলে যায় এবং ক্রকফোর্ড আপনাকে "এড়ানো" বাজে বিষয়গুলি ব্যাখ্যা করে you তাদের বোঝার মাধ্যমে আপনি এগুলির যথাযথ ব্যবহার করতে পারবেন এবং সমস্যাগুলি এড়াতে পারেন।

" আপ & Going " বই একটি অধ্যায় অন্তর্ভুক্ত সমতা যখন আলগা ব্যবহার করবেন (এই নির্দিষ্ট সারসংক্ষেপ সঙ্গে ==বনাম কঠোর) ( ===) অপারেটরদের:

কয়েকটি সাধারণ টেকওয়েতে পুরো বিশদটি সিদ্ধ করতে এবং ব্যবহার করতে হবে ==বা ===বিভিন্ন পরিস্থিতিতে আপনাকে তা জানাতে সহায়তা করার জন্য , এখানে আমার সাধারণ নিয়ম রয়েছে:

  • যদি একটি তুলনাতে মান (ওরফে পাশ) হয় তবে মান trueবা falseমান হতে পারে , এড়িয়ে চলুন ==এবং ব্যবহার করুন ===
  • একটি তুলনা হয় মান এই নির্দিষ্ট মান (হতে পারে তা যদি 0, ""অথবা [], এড়ানোর - খালি অ্যারে) ==এবং ব্যবহার ===
  • ইন সব অন্যান্য ক্ষেত্রে, তুমি নিরাপদ ব্যবহার করতে ==। এটি কেবল নিরাপদই নয়, অনেক ক্ষেত্রে এটি আপনার কোডকে এমনভাবে সহজতর করে যাতে পাঠযোগ্যতার উন্নতি হয়।

আমি এখনও জাভাস্ক্রিপ্ট বুঝতে সত্যিই সময় বিনিয়োগ করতে চাই না এমন বিকাশকারীদের জন্য ক্রকফোর্ডের আলাপের পরামর্শ দিচ্ছি a এটি এমন বিকাশকারীদের জন্য ভাল পরামর্শ যারা কেবলমাত্র জাভাস্ক্রিপ্টে মাঝে মধ্যে কাজ করেন।


7
যখন আপনি নিশ্চিত হন যে উভয় if (typeof foo == "string")
অপারেশনগুলি

25
@ মার্সেল - আপনি সঠিক, তবে সর্বদা=== অপারেটরটি ব্যবহার করা আরও ভাল এবং "আমি কি সত্যই, পুরোপুরি, 100% নিশ্চিত যে ==এটি কীভাবে আমার মনে হবে তা আচরণ করবে?"
এসটিডাব্লু

7
@ এসটিডাব্লু - ক্রকফোর্ড জাভাস্ক্রিপ্টের আলফা এবং ওমেগা না কেন তার একটি উদাহরণ, অ্যানারি ইনক্রিমেন্ট / হ্রাস ( ++/ --) ব্যবহার না করার পরামর্শ তাঁর ।
মার্সেল করপেল

10
আর ব্যবহার না ++বা --বা একক লাইন if/elseবিবৃতি বা continueবা newঅপারেটর বা পুরোপুরি বৈধ কোড চর্চা অন্য কোন সংখ্যা Crockford বলিয়া গণ্য করেছে "ক্ষতিকর"। এবং অবশ্যই কখনো কখনো এমনকি ব্যবহার সম্পর্কে চিন্তা বিবেচনা evalবা withতাদের ফাঁদ সঠিকভাবে বোঝা যায় করা থাকলেও সেগুলিকে খুঁজতে। এবং আপনি জেএস এর পরবর্তী সংস্করণ দেখেছেন? কঠোর বাক্য গঠন এবং কয়েকটি সহায়ক সহায়ক ফাংশন, কিছু কিছু যা বছরের পর বছর ধরে ভেসে আসছে, আমরা এই সময়ের পরে যা পাই তা প্রায় তা is বাক্য গঠনটি মোটেই বিকশিত হয়নি। যদি ক্রকফোর্ড এর পিছনে থাকে তবে এটি খারাপ কাজ হয়ে গেছে।
MooGoo

4
@ কফিএডিক্ট্ট - জেএসফিডেলের একটি দ্রুত পরীক্ষা অসম্মতিপূর্ণ বলে মনে হচ্ছে। তারা উভয় ক্ষেত্রেই সংবেদনশীল: jsfiddle.net/st2EU
STW

203

যদি আপনি জানেন যে তারা স্ট্রিংগুলি রয়েছে, তবে প্রকারের জন্য পরীক্ষা করার দরকার নেই।

"a" == "b"

তবে নোট করুন যে স্ট্রিং অবজেক্ট সমান হবে না।

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

মিথ্যা ফিরে আসবে।

এটিকে স্ট্রিং অবজেক্টের জন্য আদিম রূপান্তর করতে মান ওফ () পদ্ধতিটি কল করুন,

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

সত্য ফিরে আসবে


4
যে জেএসএসের জন্য ধন্যবাদ, দুটি স্ট্রিং অবজেক্ট কখনই সমান হবে না যতক্ষণ না তারা মান নির্বিশেষে একই বস্তু হয়।
অনুরাগ

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)একটি স্ট্রিং অবজেক্ট তৈরি করে এবং foo কে একটি স্ট্রিং আদিমে String(foo) রূপান্তর করে
ব্রিগেন্ড

9
@ ফেকরাইনব্রিগান্ড - কাদা হিসাবে পরিষ্কার, কিন্তু এটি যা জাভাস্ক্রিপ্ট সম্পর্কে, তাই না?
পেরিটা ব্রেটা

58

উত্তরের কেবলমাত্র একটি সংযোজন: যদি এই সমস্ত পদ্ধতিগুলি মিথ্যা প্রত্যাবর্তন করে তবে স্ট্রিংগুলি সমান বলে মনে হয়, এটি সম্ভব যে একটি স্ট্রিংয়ের বাম এবং ডানদিকে একটি শ্বেত স্থান রয়েছে। সুতরাং, .trim()তুলনার আগে কেবল স্ট্রিংয়ের শেষে একটি রাখুন :

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

আমি কী ভুল তা জানার চেষ্টা করে ঘন্টা হারিয়েছি। আশা করি এটি কারও সাহায্য করবে!


1
অনেক ধন্যবাদ. যদিও এটি আমার কাছে আশ্চর্যজনক, কারণ আমি নিশ্চিত করেছি যে বাম বা ডানদিকে কোনও শ্বেত স্থান নেই এবং এখনও আমার সমস্যা সমাধানের জন্য এটিই ছিল একমাত্র উপায়। সম্ভবত এটি কোনও স্ট্রিংয়ের অভ্যন্তরীণ উপস্থাপনের সাথে সম্পর্কিত?
নিকো

2
ধন্যবাদ @ ক্যালেক !! @ নিকো, এটি সম্ভবত জিরো-প্রস্থ-স্পেস চরিত্রের কারণে হয়েছিল যা খালি চোখে অদৃশ্য। En.wikedia.org/wiki/Zero-width_space দেখুন । এই চরিত্রটির উদ্দেশ্য থাকলেও অনেক বিকাশকারী তার অস্তিত্বকে অসন্তুষ্ট করেন!
stwr667

আপনাকে ধন্যবাদ যে হতাশাজনক ছিল যেহেতু আমার মধ্যে সমতা চেকটি ব্যর্থ হচ্ছিল তবুও আমি ডিবাগ করার সময় পরিদর্শন করার সময় কোনও শ্বেত স্পেস দেখিনি।
29 এ ড্রজউন্ডস

একটি পাঠ্য ফাইল (যেমন: ব্যবহার fetch) থেকে ভেরিয়েবল লোড করার সময় একটি সাধারণ সমস্যা । অনেক ধন্যবাদ.
সোপালাজো ডি অ্যারিরেজ

@ সোপালাজোডে আরিরিজেজ, ঠিক আছে, বেশিরভাগ জায়গায় স্ট্রিংয়ের শেষে বেশিরভাগ জায়গা বা গাড়ীর ফেরার ব্যবস্থা রয়েছে। আপনি স্বাগত জানাই।
akelec

22

আমাকে এই প্রশ্নের দিকে নিয়ে যাওয়ার কারণটি হ'ল paddingএবংwhite-spaces

আমার কেসটি পরীক্ষা করে দেখুন

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

এবং শিরোনাম ছিল " LastName"

এখানে চিত্র বর্ণনা লিখুন

সুতরাং সম্ভবত আপনি trimএই মত ফাংশন ব্যবহার করতে হবে

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

2
ধন্যবাদ এখানেই আমি .toString().trim()টাইপস্ক্রিপ্টটিতে ব্যবহার করেছি
আকিথা_ এমজে

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তবে সঠিক উপায়টি ব্যবহার করা using

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


1

উভয় স্ট্রিং খুব বড় হতে পারে তা বিবেচনা করে, এখানে 2 টি প্রধান পন্থা bitwise searchএবংlocaleCompare

আমি এই ফাংশন recommed

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
এটা ঠিক নির্বোধ। আপনি এর একটি রুবে গোল্ডবার্গ সংস্করণ তৈরি করেছেন ==
জেজেজে

হাই ওপি, আপনার সম্পাদনা এর আধ্যাত্মিক অংশে সম্পূর্ণ পৃথক এবং আপনার উত্তর ইতিমধ্যে অনেকগুলি ডাউনভোট পেয়েছে। আমি আপনাকে অনুরোধ করছি এই উত্তরটি মুছে ফেলুন এবং আপনার সম্পাদিত সংস্করণ সহ একটি নতুন পোস্ট করুন
ইলমাজ দুর্জমা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.