জাভাস্ক্রিপ্ট তুলনাতে কোন সমান অপারেটর (== বনাম ===) ব্যবহার করা উচিত?


5665

আমি জাভাস্ক্রিপ্টটি ব্যবহার করার জন্য জেএসলিন্ট ব্যবহার করছি , এবং যখন কোনও বিবৃতিতে অভ্যন্তরের তুলনা করার মতো জিনিসগুলি করা হয় তখন (তিনটি সমান চিহ্ন) ==দিয়ে প্রতিস্থাপন করার জন্য দুটি পরামর্শ ফিরে আসছি suggestions===idSele_UNVEHtype.value.length == 0if

এর পরিবর্তে কোনও পারফরম্যান্স সুবিধা ==রয়েছে ===?

অনেক তুলনামূলক অপারেটর উপস্থিত থাকায় যে কোনও পারফরম্যান্স উন্নতি স্বাগত জানানো হবে।

যদি কোনও ধরণের রূপান্তর ঘটে না, তবে সেখানে কোনও পারফরম্যান্স লাভ হবে ==?


134
কার কাছে এটি একই বিষয় আগ্রহী হতে পারে === vs ==, কিন্তু পিএইচপি, এখানে পড়তে পারেন: stackoverflow.com/questions/2401478/why-is-faster-than-in-php/...
মার্কো Demaio

257
যদি এ থাকা যেকেউ 2012 সালে হতাশ ছিল: ===হয় উপায় তুলনায় দ্রুততর ==jsperf.com/compistance-of-comparisons
রাই-

25
@ এমনিটেক এটির মতো রূপান্তর না করায় এটি হওয়া উচিত
উমুর কনটাক

19
@ এমনিটেক, আমি সন্দেহ করি যে কেউ ===ওভার ব্যবহার করে তাদের অ্যাপ্লিকেশনটি লক্ষণীয়ভাবে দ্রুততর করতে চলেছে ==। প্রকৃতপক্ষে, আধুনিক ব্রাউজারগুলিতে উভয়টির মধ্যে মাপদণ্ডের বড় পার্থক্য দেখা যায় না। ব্যক্তিগতভাবে, আমি ==সত্যই কঠোর সাম্যের প্রয়োজন না হলে আমি সর্বত্রই ব্যবহার করি।
লরেন্ট

5
এখানে ক্রকফোর্ডের জেএস দ্য গুড পার্টস টক অংশটি রয়েছে যেখানে তিনি অপারেটরগুলি ===এবং ==অপারেটরদের নিয়ে আলোচনা করেছেন : youtube.com/… এটি না খেললে এটি 15:20 এ রয়েছে
ডেভিডগিগিনস

উত্তর:


6481

কঠোর সাম্য অপারেটর ( ===) বিমূর্ত সমতা অপারেটরের সাথে একই রকম আচরণ করে ( ==) কোনও ধরণের রূপান্তর না করা ছাড়া এবং প্রকারগুলি সমান হিসাবে বিবেচিত হতে হবে।

রেফারেন্স: জাভাস্ক্রিপ্ট টিউটোরিয়াল: তুলনা অপারেটর

==অপারেটর সমতার জন্য তুলনা করবে প্রয়োজনীয় টাইপ ধর্মান্তর করার পর===অপারেটর হবে না তাই যদি দুটি মানের না একই ধরনের হয় রূপান্তর করবেন, ===কেবল ফিরে আসবে false। উভয়ই সমান দ্রুত।

ডগলাস ক্রকফোর্ডের দুর্দান্ত জাভাস্ক্রিপ্টের উদ্ধৃতি দিতে : গুড পার্টস ,

জাভাস্ক্রিপ্টে সমতা অপারেটরগুলির দুটি সেট রয়েছে: ===এবং !==, এবং তাদের দুষ্ট যুগল ==এবং !=। ভাল ব্যক্তিরা আপনার প্রত্যাশা অনুযায়ী কাজ করে। দুটি অপারেন্ড যদি একই ধরণের হয় এবং একই মান হয়, তবে ===উত্পাদন trueএবং !==উত্পাদন করে false। অপারেন্ডগুলি একই ধরণের হয়ে গেলে দুষ্ট যমজ সঠিক কাজটি করে তবে তারা যদি বিভিন্ন ধরণের হয় তবে তারা মানগুলিকে বাধ্য করার চেষ্টা করে। যে নিয়মগুলি দ্বারা তারা এগুলি করে তা জটিল এবং আপত্তিজনক। এই কয়েকটি আকর্ষণীয় ঘটনা:

'' == '0'           // false
0 == ''             // true
0 == '0'            // true

false == 'false'    // false
false == '0'        // true

false == undefined  // false
false == null       // false
null == undefined   // true

' \t\r\n ' == 0     // true

সমতা তুলনা সারণী

ট্রানজিটিভিটির অভাব উদ্বেগজনক। আমার পরামর্শটি হ'ল দুষ্ট যুগলকে কখনই ব্যবহার না করা। পরিবর্তে, সর্বদা ব্যবহার করুন ===এবং !==। অপারেটরের falseসাথে সমস্ত তুলনা স্রেফ দেখানো হয়েছে ===


হালনাগাদ:

একটি ভাল পয়েন্ট দ্বারা আপ আনা হয় @Casebash মন্তব্য এবং @Phillipe Laybaert এর উত্তর বিষয়ে বস্তু। বস্তুর জন্য, ==এবং ===একে অপরের সাথে ধারাবাহিকভাবে কাজ করুন (একটি বিশেষ ক্ষেত্রে বাদে)।

var a = [1,2,3];
var b = [1,2,3];

var c = { x: 1, y: 2 };
var d = { x: 1, y: 2 };

var e = "text";
var f = "te" + "xt";

a == b            // false
a === b           // false

c == d            // false
c === d           // false

e == f            // true
e === f           // true

বিশেষ ক্ষেত্রে হ'ল আপনি যখন কোনও বস্তুর সাথে আদিম তুলনা করেন যা তার toStringবা valueOfপদ্ধতির কারণে একই আদিমকে মূল্যায়ন করে । উদাহরণস্বরূপ, Stringকনস্ট্রাক্টর ব্যবহার করে তৈরি স্ট্রিং অবজেক্টের সাথে একটি স্ট্রিং আদিমের তুলনা বিবেচনা করুন ।

"abc" == new String("abc")    // true
"abc" === new String("abc")   // false

এখানে ==অপারেটর দুটি বস্তুর মানগুলি পরীক্ষা করছে এবং ফিরে আসছে true, তবে তারা ===দেখতে পাচ্ছে যে তারা একই ধরণের নয় এবং ফিরে আসছে false। কোনটি সঠিক? এটি আপনি তুলনা করার চেষ্টা করছেন তার উপর নির্ভর করে depends আমার পরামর্শটি হ'ল প্রশ্নটি পুরোপুরি বাইপাস করা এবং Stringস্ট্রিং ল্যাটারালগুলি থেকে স্ট্রিং অবজেক্ট তৈরি করতে কনস্ট্রাক্টর ব্যবহার করবেন না ।

রেফারেন্স
http://www.ecma-international.org/ecma-262/5.1/#sec-11.9.3


236
প্রকারগুলি একই রকম হলে === দ্রুত হয় না। প্রকারগুলি যদি একই রকম না হয় তবে === দ্রুত হবে কারণ এটি রূপান্তরটি করার চেষ্টা করবে না।
বিল করুন

520
=== কখনও == এর চেয়ে ধীর হবে না। তারা উভয়ই টাইপ চেকিং করে, সুতরাং === == এর তুলনায় অতিরিক্ত কিছু করে না, তবে টাইপ চেকটি === প্রকারগুলি সমান না হলে শীঘ্রই প্রস্থান করতে পারে।
বিলটি

246
সমস্ত == /! = এর সাথে === /! == জেএস ফাইলের আকার বাড়ায়, লোড হতে আরও সময় লাগবে। :)
মার্কো ডেমাইও

92
"... তারা যে নিয়মগুলি দ্বারা এটি করে তা জটিল এবং প্রতিকূল নয় ..." এখন প্রোগ্রামিং করার সময় এই জাতীয় বিবৃতি আপনাকে এতটা সুরক্ষিত মনে করে ...
জোহান

47
ক্রকফোর্ড থেকে: "ট্রানজিটিভিটির অভাব উদ্বেগজনক" " যদি আপনি সফ্টওয়্যারটি বিকাশ করেন এবং তুলনামূলক অপারেটরকে উদ্বেগজনকভাবে ট্রান্সজিটিভিটির অভাব খুঁজে না পান, বা যদি == এবং === বা ফাইলের আকার / লোড সময়ের মধ্যে গতির তুলনা আপনার তুলনায় অপারেটরের আচরণের ট্রানজিটিভ নির্ধারণের চেয়ে অগ্রাধিকার গ্রহণ করে তবে আপনি ফিরে যেতে এবং আবার শুরু করার প্রয়োজন হতে পারে।
জিঙ্গলেস্তুলা

1144

==অপারেটর ব্যবহার করে ( সমতা )

true == 1; //true, because 'true' is converted to 1 and then compared
"2" == 2;  //true, because "2" is converted to 2 and then compared

===অপারেটর ব্যবহার করে ( পরিচয় )

true === 1; //false
"2" === 2;  //false

এটি কারণ ইক্যুয়ালিটি অপারেটর ==জোর করে টাইপ করে , যার অর্থ দোভাষক স্পষ্টভাবে তুলনা করার আগে মানগুলি রূপান্তর করার চেষ্টা করে।

অন্যদিকে, সনাক্তকারী অপারেটর ===প্রকারের জবরদস্তি করে না এবং তুলনা করার সময় মানগুলিকে রূপান্তর করে না এবং এটি এক ধাপ এড়িয়ে যাওয়ায় দ্রুত হয় ( এই জেএস বেনমার্ক পরীক্ষা অনুযায়ী)।


9
@ সফটওয়্যার বানর: মানের ধরণের জন্য নয় (সংখ্যা, বুলিয়ান, ...)
ফিলিপ লেবার্ট

33
যেহেতু কেউ কিছু জাভাস্ক্রিপ্ট সমতা ছক উল্লিখিত হয়েছে, এটি হল: dorey.github.io/JavaScript-Equality-Table
অকস্মাৎ জ্বলিয়া ত্তঠা

6
প্রথম বিবৃতিতে, আপনি কি নিশ্চিত যে 'সত্য' 1 তে রূপান্তরিত হয় এবং 1 টি সত্যে রূপান্তরিত হয়?
শাদি নমরোতি

2
"সমতা" এবং "পরিচয়" পদটি কোথা থেকে এসেছে? স্ট্যান্ডার্ডটি এই পদগুলি ব্যবহার করে না। এটি =="বিমূর্ত সাম্য" এবং এটি ==="কঠোর সমতা" বলে। ==কোনও ধরণের "সাম্য" ডাকে মঞ্জুরি দেওয়া আইএমএইচও ভয়ঙ্কর, যেহেতু এটি ট্রানজিটিভ নয়, তবে কেন বাজে? যদিও "পরিচয়" নিয়ে আমি আরও ইস্যু নিই; আমি মনে করি যে শব্দটি কার্যকরভাবে বিভ্রান্তিকর, যদিও এটি "কার্যকর"। তবে গুরুত্বের সাথে, কে "পরিচয়" শব্দটি তৈরি করেছিলেন? আমি স্ট্যান্ডার্ডটি অনুসন্ধান করেছি এবং এটি খুঁজে পেলাম না।
রায় তোয়াল

1
"পরিচয়" খুব বেশি ভুল শব্দ। আমি যে সমস্ত ভাষাগুলি ব্যবহার করেছি সেগুলিতে পরিচয়ের তুলনা একই অর্থের মধ্যে একটি অর্থাত্ দুটি রেফারেন্স ভেরিয়েবল কেবল সমমানের সত্তাকে নয় , একই সত্তাকে নির্দেশ করছে।
ইনিগো

722

মধ্যে সমতা তুলনা একটি উত্সাহব্যঞ্জক সচিত্র উপস্থাপনা ==এবং ===

সূত্র: http://dorey.github.io/ জাভা স্ক্রিপ্ট- গুণমান- টেবিল /


var1 === var2

===জাভাস্ক্রিপ্ট সমতা পরীক্ষার জন্য ব্যবহার করার সময় , সবকিছু যেমন রয়েছে তেমন। মূল্যায়নের আগে কোনও কিছুই রূপান্তরিত হয় না।

জেএসে === এর সমতা মূল্যায়ন


var1 == var2

==জাভাস্ক্রিপ্ট সমতা পরীক্ষার জন্য ব্যবহার করার সময় , কিছু মজার রূপান্তর ঘটে।

জেএসে == এর সমতা মূল্যায়ন

গল্পের শিক্ষা:

===আপনি যদি রূপান্তরগুলি পুরোপুরি না বুঝেন তবে ব্যবহার করুন ==


3
@ এমফাইন আপনার অর্থ === বা! == এর পরিবর্তে == বা! =! নতুন
কোডারকে

2
আমার অভিজ্ঞতা থেকে তিনটি সমান ব্যবহার সমস্যার কারণ হতে পারে এবং পুরোপুরি না বুঝলে এড়ানো উচিত। দুটি সমান আরও ভাল ফলাফল দেয় কারণ 99% সময় আমি সত্যিই টাইপগুলির সমান হতে চাই না
vsync

12
@vsync: আপনি যদি সত্যিই ধরনের সমান হতে চাই না , আপনি উচিত ব্যবহার তিন সমান !
এসএনএজি

6
এক ব্যতিক্রম: আপনি নিরাপদে ব্যবহার করতে পারেন x == nullযদি চেক করতে xহয় nullবা undefined
অ্যান্ডি

1
@ user648026: প্রশ্ন সম্পর্কে সমতা সঙ্গে তুলনা ==বনাম ===। উচ্চ এবং নিম্নতর কেসগুলি যাইহোক অসম, এবং falseউভয় ==এবং ===অপারেটরগুলির সাথে ফিরে আসবে । এছাড়াও, কীওয়ার্ড true, false, undefined, null, Infinityজাতীয় একমাত্র ক্ষেত্রে বিদ্যমান, এবং উপরের অথবা মিশ্র ক্ষেত্রেই ব্যবহার করা যাবে না।
এসএনএগ

609

এখানে উত্তরগুলিতে, আমি সমান অর্থ কী সম্পর্কে কিছুই পড়িনি । কেউ কেউ বলবে যে এর ===অর্থ সমান এবং একই ধরণের , তবে এটি সত্য নয়। এটির অর্থ হ'ল উভয় অপারেন্ড একই পদার্থকে উল্লেখ করে বা মানের ধরণের ক্ষেত্রে একই মান থাকে

সুতরাং, আসুন নিম্নলিখিত কোডটি নেওয়া যাক:

var a = [1,2,3];
var b = [1,2,3];
var c = a;

var ab_eq = (a === b); // false (even though a and b are the same type)
var ac_eq = (a === c); // true

এখানেও একই:

var a = { x: 1, y: 2 };
var b = { x: 1, y: 2 };
var c = a;

var ab_eq = (a === b); // false (even though a and b are the same type)
var ac_eq = (a === c); // true

অথবা এমনকি:

var a = { };
var b = { };
var c = a;

var ab_eq = (a === b); // false (even though a and b are the same type)
var ac_eq = (a === c); // true

এই আচরণটি সর্বদা সুস্পষ্ট হয় না। গল্পটি সমান হওয়া এবং একই ধরণের হওয়ার চেয়ে আরও অনেক কিছুই রয়েছে।

বিধিটি হ'ল:

: VALUE প্রকার (নম্বর) জন্য
a === b আয় যদি সত্য হয়aএবংbএকই মান আছে এবং একই ধরণের হয়

রেফারেন্স প্রকারের জন্য:
a === b সত্যটি প্রদান করেaএবংbঠিক একই বস্তুর রেফারেন্স দেয়

স্ট্রিংগুলির জন্য:
a === b সত্য হয়aএবংbযদি উভয় স্ট্রিং হয় এবং ঠিক একই অক্ষর থাকেreturns


স্ট্রিংস: বিশেষ ক্ষেত্রে ...

স্ট্রিংগুলি মান ধরণের নয়, তবে জাভাস্ক্রিপ্টে তারা মান ধরণের মতো আচরণ করে, সুতরাং যখন স্ট্রিংয়ের অক্ষরগুলি একই হয় এবং যখন তারা একই দৈর্ঘ্যের হয় (তৃতীয় নিয়মে বর্ণিত হয়েছে) তখন সেগুলি "সমান" হবে

এখন এটি আকর্ষণীয় হয়ে উঠেছে:

var a = "12" + "3";
var b = "123";

alert(a === b); // returns true, because strings behave like value types

তবে কীভাবে ?:

var a = new String("123");
var b = "123";

alert(a === b); // returns false !! (but they are equal and of the same type)

আমি ভেবেছি স্ট্রিংগুলি মান ধরণের মতো আচরণ করে? ঠিক আছে, এটি নির্ভর করে আপনি কাকে জিজ্ঞাসা করছেন ... এক্ষেত্রে ক এবং খ একই ধরণের নয়। aটাইপ হয় Object, যখন bটাইপ হয় string। কেবল মনে রাখবেন যে Stringকন্সট্রাক্টর ব্যবহার করে স্ট্রিং অবজেক্ট তৈরি করা টাইপের এমন কিছু তৈরি করে যা বেশিরভাগ সময়Object স্ট্রিং হিসাবে আচরণ করে ।


6
অ্যাক্টিভা: আমি স্পষ্ট করে বলব, স্ট্রিংগুলি কেবল তখনই সমান হয় যখন তারা আক্ষরিক হয়। নতুন স্ট্রিং ("abc") === "এবিসি" মিথ্যা (আমার গবেষণা অনুসারে)।
লরেন্স ডল

3
new Number() == "0"। ফায়ারফক্সেও:(function(){}) == "function () {\n}"
থমাস এডিং

3
কারণ ব্যাখ্যা করার জন্য আপনাকে ধন্যবাদ new String("123") !== "123"। তারা বিভিন্ন ধরণের। সরল, তবু বিভ্রান্তিকর।
স্টাইফেল

21
Stringঅবজেক্টগুলি স্ট্রিংয়ের মতো আচরণ করে অন্য কোনও বস্তুর মতোnew Stringকখনই ব্যবহার করা উচিত নয়, কারণ এটি সত্যিকারের স্ট্রিং তৈরি করে না। একটি সত্যিকারের স্ট্রিং এবং স্ট্রিং লিটারেল দিয়ে তৈরি করা যেতে পারে বা বিনাString ফাংশন হিসাবে কল করা যায় new , উদাহরণস্বরূপ:String(0); //"0", Real string, not an object
Esailija

6
তবে আপনি যে ক্ষেত্রে বিশদ বর্ণনা করেছেন, অপারেটর "==" হুবহু একই আচরণ করে।
ইয়ারন লেভি

270

আমাকে এই পরামর্শটি যুক্ত করুন:

সন্দেহ হলে স্পেসিফিকেশন পড়ুন !

ECMA-262 হ'ল স্ক্রিপ্টিং ভাষার স্পেসিফিকেশন যা জাভাস্ক্রিপ্ট একটি উপভাষা is অবশ্যই অনুশীলনে এটি গুরুত্বপূর্ণ যে কোনও কিছু কীভাবে পরিচালিত হওয়ার কথা বলে তার একটি গুরূত্বপূর্ণ সংজ্ঞা তুলনায় সবচেয়ে গুরুত্বপূর্ণ ব্রাউজারগুলি কীভাবে আচরণ করে। তবে এটি কেন নতুন স্ট্রিং ("a")! == "এ" তা বুঝতে সহায়ক ।

দয়া করে আমাকে এই প্রশ্নটি পরিষ্কার করার জন্য স্পেসিফিকেশনটি কীভাবে পড়বেন তা ব্যাখ্যা করতে দিন। আমি দেখতে পাচ্ছি যে খুব পুরানো এই বিষয়টিতে খুব অদ্ভুত প্রভাবের জন্য কারও কাছেই উত্তর ছিল না। সুতরাং, যদি আপনি কোনও স্পেসিফিকেশন পড়তে পারেন তবে এটি আপনাকে আপনার পেশায় দুর্দান্তভাবে সহায়তা করবে। এটি একটি অর্জিত দক্ষতা। সুতরাং, চলুন চলুন।

=== এর জন্য পিডিএফ ফাইলটি সন্ধান করা আমাকে স্পেসিফিকেশনের 56 পৃষ্ঠায় নিয়ে আসে: 11.9.4। স্ট্রাইক ইকুয়াল অপারেটর (===) , এবং স্পেসিফিকেশনটি অনুসন্ধানের পরে আমি পাই:

11.9.6 স্ট্রাইক ইক্যুয়ালিটির তুলনা অ্যালগরিদম
তুলনা x === y, যেখানে x এবং y মান, সত্য বা মিথ্যা উত্পাদন করে । এই জাতীয় তুলনা নিম্নরূপে সম্পাদিত হয়:
  ১. যদি প্রকার (এক্স) প্রকার (y) থেকে পৃথক হয় তবে মিথ্যা প্রত্যাবর্তন করুন ।
  ২. যদি প্রকার (x) অপরিজ্ঞাপিত হয় তবে সত্যটি প্রত্যাবর্তন করুন ।
  ৩. যদি প্রকার (x) নাল হয় তবে সত্যটি প্রত্যাবর্তন করুন ।
  ৪. যদি টাইপ (এক্স) নম্বর না হয় তবে পদক্ষেপ ১১ এ যান
  5.. x যদি এনএন হয় তবে মিথ্যা প্রত্যাবর্তন করুন ।
  Y. যদি yNN হয় তবে মিথ্যা প্রত্যাবর্তন করুন ।
  X. x যদি y এর সমান সংখ্যার মান হয় তবে সত্যটি প্রত্যাবর্তন করুন ।
  ৮. x যদি +0 হয় এবং y −0 হয় তবে সত্য আসুন ।
  9. যদি x −0 হয় এবং y +0 হয়, সত্য আসুন ।
  10. মিথ্যা প্রত্যাবর্তন ।
  ১১. যদি টাইপ (x) স্ট্রিং হয়, তবে x এবং y হুবহু অক্ষরের একই ক্রম (একই দৈর্ঘ্য এবং একই অবস্থানে একই অক্ষর) হলে সত্যটি প্রত্যাবর্তন করুন ; অন্যথায়, মিথ্যা ফিরে ।
  ১২. যদি টাইপ (এক্স) বুলিয়ান হয় তবে x এবং y উভয়ই সত্য বা মিথ্যা উভয় হলে সত্যটি প্রত্যাবর্তন করুন ; অন্যথায়, মিথ্যা ফিরে ।   13. সত্য ফিরে
যদি x এবং y একই বস্তুকে বোঝায় বা তারা যদি একে অপরের সাথে যুক্ত হওয়া বিষয়গুলি উল্লেখ করে (দেখুন 13.1.2)। অন্যথায়, মিথ্যা ফিরে ।

আকর্ষণীয় পদক্ষেপ ১১ Yes হ্যাঁ, স্ট্রিংগুলি মান ধরণের হিসাবে বিবেচিত হয়। তবে এটি কেন নতুন স্ট্রিং ("a")! == "এ" ব্যাখ্যা করে না । আমাদের কাছে কি কোনও ব্রাউজার ECMA-262 মেনে চলছে না?

এত দ্রুত নয়!

আসুন অপারেন্ডগুলির ধরণগুলি পরীক্ষা করে দেখি। এগুলি টাইপ-এ ()মুড়িয়ে নিজের জন্য চেষ্টা করে দেখুন । আমি দেখতে পেয়েছি যে নতুন স্ট্রিং ("এ") একটি অবজেক্ট এবং পদক্ষেপ 1 ব্যবহার করা হয়েছে: প্রকারগুলি পৃথক হলে মিথ্যা প্রত্যাবর্তন করুন ।

আপনি যদি ভাবছেন যে কেন নতুন স্ট্রিং ("ক") কোনও স্ট্রিং ফিরে আসে না, তবে কোনও স্পেসিফিকেশন পড়ার কিছু অনুশীলন কীভাবে হবে? আনন্দ কর!


এইডিয়াকাপি নীচে একটি মন্তব্যে এটি লিখেছেন:

স্পেসিফিকেশন থেকে

১১.২.২ নতুন অপারেটর :

যদি টাইপ (কনস্ট্রাক্টর) অবজেক্ট না হয় তবে একটি টাইপরর ব্যতিক্রম নিক্ষেপ করুন।

অন্য কথায়, স্ট্রিং যদি অবজেক্ট টাইপ না হয় তবে এটি নতুন অপারেটরের সাথে ব্যবহার করা যাবে না।

নতুন স্ট্রিং কনস্ট্রাক্টরদের জন্যও সর্বদা একটি অবজেক্ট প্রদান করে। ও হায়! স্ট্রিংগুলির জন্য মূল্য শব্দার্থক পদক্ষেপ (১১ ধাপ দেখুন) হারিয়ে গেছে।

এবং শেষ পর্যন্ত এর অর্থ: নতুন স্ট্রিং ("এ")! == "ক"


প্রকারের ফলাফল (x) টাইপফের মতো একই হতে পারে?
Dfr

@ নীচে আমি আচরণের সম্পর্কে উদ্বেগকে ঠিক বুঝতে পারি না new String('x'), কারণ আমি বুনোতে এমন কোনও কোড দেখিনি যা আদিম মোড়কের জিনিসগুলি ব্যবহার করে এবং আমি মনে করি না এর খুব ভাল কারণ আছে, বিশেষত আজকের দিনগুলিতে নয়। আপনি কি কখনও কোডটির মুখোমুখি হয়েছেন?
অ্যান্ডি

@ এবং সমস্যাটি ক্ষতিকারক বা কেবল ম্লান তৃতীয় পক্ষের কোড, তবে আপনি ধরে নিতে পারবেন না যে কেউই ব্যবহার করে না new String()
11:48

যদি এটি ম্লান হয়, === আপনি কীভাবে এটি খুঁজে পাবেন। যদি এটি দূষিত হয় তবে আমি মনে করি new String()আপনার উদ্বেগগুলির মধ্যে সবচেয়ে কম। আমি তাত্ত্বিকভাবে উদ্বেগটি বুঝতে পারি, তবে আবার, আপনার কি কোনও বাস্তব-বিশ্বের উদাহরণ রয়েছে? আমার কাছে এটি সেই পুরানো উদ্বেগের মতো যা কেউ undefinedঅন্য একটি মানকে সেট করতে পারে ।
অ্যান্ডি

আপনি কোথায় পেয়েছেন তা আমি জানি না, তবে আপনার তুলনা অ্যালগরিদমটি ২ য় ধাপে ভুল হয়ে যায় Section বিভাগ ".2.২.১৫ কঠোর সমতা তুলনা" প্রথমে প্রকারগুলি একই কিনা তা পরীক্ষা করে দেখুন, হ্যাঁ তারা সংখ্যা কিনা। যদি তা না হয় তবে বিভাগ "7.2.12 সেমভেলিউন নাম্বার (x, y)" ব্যবহৃত হয়।
মরিচা কোর

101

পিএইচপি এবং জাভাস্ক্রিপ্টে এটি একটি কঠোর সমতা অপারেটর। যার অর্থ, এটি উভয় প্রকার এবং মানগুলির তুলনা করবে।


10
@ ডেভিড: সঠিক এই কারণেই এই উত্তরটি সঠিক (বা এমনকি ভুল)
ফিলিপ লেবায়ার্ট

7
@ ডেভিড var a = {}, b = {}; a == bমিথ্যা প্রত্যাবর্তন
nyuszika7h

6
হ্যাঁ: একই ধরণের এবং মান সহ দুটি পৃথক বস্তু মিথ্যা তুলনা করে, এই উত্তরটি ঠিক ভুল। এটির কেন 50 টি উর্ধ্বতন রয়েছে?
অ্যালেক্সিস

4
আমি বুঝতে পেরেছি এটি পুরানো, তবে কেন এই উত্তরটি এখনও "সঠিক" তা স্পষ্ট করে বলা কারণ উদাহরণস্বরূপ var a = {}, b = {};উভয় aএবং bসত্যই উভয় একটি বস্তু, তবে তারা প্রযুক্তিগতভাবে বলতে গেলে এটি একই মান নয় । সেগুলি বিভিন্ন উদাহরণ। নোট করুন যে তুলনামূলক উদাহরণগুলি আদিমদের তুলনা করার চেয়ে আলাদা আচরণ করে। যা সম্ভবত এই বিভ্রান্তি যুক্ত করে। আপনি যদি আদিম ডেটা ধরণের সংস্করণ ব্যবহার করেন তবে আপনি অনুরূপ তুলনা আচরণ দেখতে পাবেন। যেমন new String('asdf')বা new Number(5)। প্রাক্তন: new Number(5) == new Number(5)এটি একই মান ধারণ করেও মিথ্যা।
নরম্যান ব্রিউ

1
আমরা সকলেই ভুলে যাই যে কোনও বস্তুর উল্লেখ একটি মান ধরণের, এটি মেমরির স্লটে নির্দেশক হিসাবে। অবজেক্টের তুলনাটি "অবজেক্টের মান" তুলনা করে না তবে উভয় পয়েন্টার একই হয় যার অর্থ তারা একই মেমরি স্লটটি উল্লেখ করে। প্রকারের সাথে তুলনা করার ক্ষেত্রে এটি একটি খুব সূক্ষ্ম পার্থক্য, কারণ "===" অপারেটরকে সত্যই "যদি টাইপ, মান এবং মেমরির মধ্যে অবজেক্টের রেফারেন্স একই হয়" বলতে হয়।
স্টোকলি

101

আমি ফায়ারবক্সে ফায়ারবগের সাথে এই জাতীয় কোড ব্যবহার করে এটি পরীক্ষা করেছি :

console.time("testEquality");
var n = 0;
while(true) {
    n++;
    if(n==100000) 
        break;
}
console.timeEnd("testEquality");

এবং

console.time("testTypeEquality");
var n = 0;
while(true) {
    n++;
    if(n===100000) 
        break;
}
console.timeEnd("testTypeEquality");

আমার ফলাফল (প্রতিটি পাঁচ বার পরীক্ষিত এবং গড়):

==: 115.2
===: 114.4

সুতরাং আমি বলব যে মিনিস্কুলের পার্থক্য (এটি 100000 পুনরাবৃত্তিরও বেশি, মনে রাখবেন) নগণ্য। পারফরম্যান্স করার কোনও কারণ নয়=== । সুরক্ষা টাইপ করুন (ভাল, আপনি জাভাস্ক্রিপ্টে পেতে যাবেন ঠিক তত নিরাপদ), এবং কোডের মানটি।


3
সুরক্ষা প্রকারের চেয়ে বেশি আপনি যৌক্তিক নির্ভুলতা চান - কখনও কখনও আপনি অসম্মতিতে জিনিসগুলি সত্য হতে চান ==
rpjohnst

4
এখন, যখন ==অপারেটরের জন্য প্রকৃত ধরণের জাল রয়েছে তখন এগুলি কীভাবে তুলনা করবেন ? মনে রাখবেন, যখন সেখানে পারফরম্যান্স বাড়ানো হয়।
হুবার্ট ওজি

2
মেজর পার্থক্য যখন কেবলমাত্র টাইপ বৈষম্য ত্বরান্বিত করার দ্রুততার পূর্বোক্ত কারণে সঠিকভাবে পরীক্ষা করা হয়। jsfiddle.net/4jhuxkb2
ডগ মোরো

আপনি অপারেশন / সেকেন্ডে এর মতো কোনও কিছুর পারফরম্যান্স পরিমাপ করেন, কনসোল.টাইম () ব্যবহার করে টাইপ জবরদস্তি না নেওয়ার সময় কোন একক ব্রাউজারে (প্রায় 5% মার্কেট শেয়ার সহ একটি) একটি পরীক্ষা নয় (পুরো কারণ এটি ধীর) অ্যাকাউন্টে। এটি সম্পূর্ণ অর্থহীন পরীক্ষা। আপনি সঠিক যে কর্মক্ষমতা কারণ ব্যবহার না করার হয় ===বেশি ==কিন্তু আপনি ভুল যে তাদের কর্মক্ষমতা মূলত সমান হয় এবং আপনি এই পরীক্ষাটি যে প্রমাণ মনে হবে, 'অনেক অন্যান্য ব্যক্তিদের রাজি সম্পূর্ণভাবে আমাকে অর্থহীন।
স্টিফেন এম ইরভিং

96

জাভাস্ক্রিপ্টে এটি একই মান এবং প্রকারের অর্থ।

উদাহরণ স্বরূপ,

4 == "4" // will return true

কিন্তু

4 === "4" // will return false 

87

=== অপারেটর কঠোর তুলনা অপারেটর বলা হয়, এটা না থেকে ভিন্ন == অপারেটর।

2 বার a এবং খ নিতে দেয়।

জন্য "একটি == B" হতে সত্য a ও b প্রয়োজনে নির্ণয় করা একই মান

ক্ষেত্রে "একটি === B" a ও b হতে হবে একই মান এবং একই ধরনের এটা সত্য নির্ণয় করার জন্য।

নিচের উদাহরণটি ধরুন

var a = 1;
var b = "1";

if (a == b) //evaluates to true as a and b are both 1
{
    alert("a == b");
}

if (a === b) //evaluates to false as a is not the same type as b
{
    alert("a === b");
}

সংক্ষেপে ; == অপারেটর ব্যবহার করে এমন পরিস্থিতিতে সত্যকে মূল্যায়ন করতে পারে যেখানে আপনি এটি === ব্যবহার করে না চান অপারেটরটি নিরাপদ হবে।

90% ব্যবহারের দৃশ্যে আপনি কোনটি ব্যবহার করবেন তা বিবেচ্য নয় তবে আপনি যদি একদিন কিছু অপ্রত্যাশিত আচরণ পান তখন এই পার্থক্যটি জানা সহজ।


82

==এত অপ্রত্যাশিত কেন ?

আপনি ""শূন্য সংখ্যার সাথে একটি খালি স্ট্রিং তুলনা করলে আপনি কী পাবেন 0?

true

হ্যাঁ, এটি ==একটি খালি স্ট্রিং অনুসারে ঠিক এবং একই সাথে শূন্য সংখ্যাটি।

এবং এটি এখানেই শেষ হয় না, এখানে আরও একটি রয়েছে:

'0' == false // true

অ্যারেগুলির সাথে জিনিসগুলি সত্যই অদ্ভুত হয়ে যায়।

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

তারপরে স্ট্রিংয়ের সাথে উইডার

[1,2,3] == '1,2,3' // true - REALLY?!
'\r\n\t' == 0 // true - Come on!

এটা খুব খারাপ হচ্ছে:

সমান কখন হয় না সমান?

let A = ''  // empty string
let B = 0   // zero
let C = '0' // zero string

A == B // true - ok... 
B == C // true - so far so good...
A == C // **FALSE** - Plot twist!

এটা আমাকে আবার বলতে দাও:

(A == B) && (B == C) // true
(A == C) // **FALSE**

এবং এটি আদিমদের সাথে পেয়ে যাওয়া কেবল ক্রেজি জিনিস।

আপনি যখন ==বস্তুগুলি ব্যবহার করেন তখন এটি সম্পূর্ণ নতুন স্তরের পাগল ।

এই মুহুর্তে আপনার সম্ভবত ভাবছি ...

কেন এমন হয়?

এটি কারণ "ট্রিপল সমান" ( ===) এর বিপরীতে যা দুটি মান একই হয় কিনা তা যাচাই করে।

==একটি করে অন্যান্য পণ্যদ্রব্য আভা

এটিতে ফাংশনগুলির জন্য বিশেষ হ্যান্ডলিং, নালস, অপরিজ্ঞাত, স্ট্রিংগুলির জন্য বিশেষ হ্যান্ডলিং রয়েছে, আপনি এটির নাম দিন।

এটা খুব অসম্ভব।

প্রকৃতপক্ষে, আপনি যদি এমন কোনও ফাংশন লেখার চেষ্টা করেন যা এটি করে যা ==এটির মতো দেখায়:

function isEqual(x, y) { // if `==` were a function
    if(typeof y === typeof x) return y === x;
    // treat null and undefined the same
    var xIsNothing = (y === undefined) || (y === null);
    var yIsNothing = (x === undefined) || (x === null);

    if(xIsNothing || yIsNothing) return (xIsNothing && yIsNothing);

    if(typeof y === "function" || typeof x === "function") {
        // if either value is a string 
        // convert the function into a string and compare
        if(typeof x === "string") {
            return x === y.toString();
        } else if(typeof y === "string") {
            return x.toString() === y;
        } 
        return false;
    }

    if(typeof x === "object") x = toPrimitive(x);
    if(typeof y === "object") y = toPrimitive(y);
    if(typeof y === typeof x) return y === x;

    // convert x and y into numbers if they are not already use the "+" trick
    if(typeof x !== "number") x = +x;
    if(typeof y !== "number") y = +y;
    // actually the real `==` is even more complicated than this, especially in ES6
    return x === y;
}

function toPrimitive(obj) {
    var value = obj.valueOf();
    if(obj !== value) return value;
    return obj.toString();
}

তাহলে এর অর্থ কি?

এর অর্থ == জটিল।

কারণ এটি জটিল কারণ আপনি যখন এটি ব্যবহার করবেন তখন কী ঘটবে তা জানা শক্ত।

যার অর্থ আপনি বাগ সহ শেষ করতে পারেন।

গল্পটির নৈতিকতা হ'ল ...

আপনার জীবন কম জটিল করুন।

===পরিবর্তে ব্যবহার করুন ==

শেষ।


আপনার looseEqualভুল। Function == Function.toString()সত্য, তবে looseEqual(Function, Function.toString())মিথ্যা। আপনি কেন প্রথম দিকে ফাংশনগুলি ফিল্টার করে তা নিশ্চিত নন।
অরিওল

@ ওরিওল আপনি ঠিক বলেছেন, আমি অ্যাকাউন্টটির জন্য কোডটি আপডেট করেছি, আমার পরীক্ষার ভিত্তিতে এফওয়াইআই "ফাংশন" এর জন্য ফিল্টার অপসারণ করার পক্ষে যথেষ্ট ছিল না, পরিবর্তে "ফাংশনগুলি" পুরোপুরি আলাদাভাবে পরিচালনা করতে হয়েছিল।
লুইস পেরেজ

সচেতন থাকুন যে অনুমানগুলি ফাংশনগুলি আলাদাভাবে আচরণ করে না, তারা কেবলমাত্র বস্তু। সমস্যাটি দেখে মনে হচ্ছে আপনি typeof x === "object"এটি কোনও বস্তু কিনা তা যাচাই করতে নির্ভর করে তবে `প্রকারটি কেবল নন-নাল আদিমদের জন্য কাজ করে। কোনও মান কোনও বস্তু কিনা তা পরীক্ষা করার জন্য
ওরিওল

আমি ফাংশন এবং অবজেক্টগুলি একইরূপে চিকিত্সা করার চেষ্টা করেছি তবে তার ফলাফলগুলি ভুল ছিল। উদাহরণস্বরূপ, যদি ফাংশনগুলিকে অবজেক্টগুলির মতো আচরণ করা হয় তবে কোনও ফাংশনের সাথে কোনও অবজেক্টের সাথে তুলনা করা যা ভ্যালুআফ () বা টুস্ট্রিং () ফাংশনটির সাথে মেলে যা পাস করবে তবে বাস্তবে তা হয় না। উদাহরণ: (function blah() { console.log("test"); }) != {valueOf:function(){return "function blah() { console.log(\"test\"); }";}}- এই জেএস ফ্রিডলটি পরীক্ষা করুন যা সমস্ত পরীক্ষা চালায়: jsfiddle.net/luisperezphd/7k6gcn6g (সেখানে 1,225 পরীক্ষার অনুমতি রয়েছে)
লুইস পেরেজ

1
আপনি ঠিক বলেছেন, দুর্দান্ত পর্যবেক্ষণ, এটি মূল বিষয়টির উপর জোর দেয় যা ==প্রচুর পরিমাণে ফলাফলের প্রত্যাশা করা খুব কঠিন করে তোলে যখন ===অনেক বেশি সরল এবং অনুমানযোগ্য যা মূল কারণগুলির ===মধ্যে একটি হ'ল প্রস্তাবিত পছন্দ। (আমি আপনার পয়েন্টটি উল্লেখ করে উত্তরে একটি নোট যুক্ত করব)
লুইস পেরেজ

81

===চেক একই পক্ষের সমান টাইপ সেইসাথে মান


উদাহরণ:

'1' === 1 // will return "false" because `string` is not a `number`

সাধারণ উদাহরণ:

0 == ''  // will be "true", but it's very common to want this check to be "false"

আর একটি সাধারণ উদাহরণ:

null == undefined // returns "true", but in most cases a distinction is necessary

অনেক সময় একটি untyped চেক কারণ আপনার যদি মান পারেন হয় না যত্ন কুশলী হতে হবে undefined, null, 0 বা""


7
এছাড়াও,'string' !== 'number'
হোমার

71

কঠোর সাম্যতা / তুলনার জন্য জাভাস্ক্রিপ্ট সম্পাদন প্রবাহ ডায়াগ্রাম '==='

জাভাস্ক্রিপ্ট কঠোর সাম্য

কঠোর সাম্য / তুলনার জন্য জাভাস্ক্রিপ্ট সম্পাদন প্রবাহ ডায়াগ্রাম '=='

জাভাস্ক্রিপ্ট অ সাম্য


আমি বুঝতে পারছি না কেন stringতীরটি বড় ধূসর বাক্সের দিকে ইঙ্গিত করছে, এটির অর্থ বোঝানো হচ্ছে যে বাধাটি কোনও সংখ্যায় স্ট্রিংটি ফেলেছে?
vsync

@vsync এটি ধূসর বাক্সের মধ্যে স্ট্রিং বিকল্পের দিকে নির্দেশ করে অর্থাৎ স্ট্রিং -> # || NaN। জাভাস্ক্রিপ্ট কোনও টাইপ-স্ক্রিপ্টের ভাষা নয়, মূলত এটির যে কোনও ধরণের ভেরিয়েবল থাকতে পারে। সুতরাং, এটি ধূসর বাক্সে নির্দেশিত।
সমর পান্ডা

আমি কেবল জিজ্ঞাসা করেছি যে এটি ingালাইয়ের উদ্দেশ্যে যদি যেহেতু stringএকটি প্রকারের numberসাথে তুলনা করা উচিত বলে মনে করা হয়, তাই বাধাটি কী স্ট্রিংটির সাথে তুলনা করা উচিত এবং ততক্ষণে স্ট্রিংটি কাস্ট করা উচিত?
vsync

1
বড় ধূসর বাক্সটি হ'ল ToNumberবিভিন্ন ধরণের দেওয়া হলে কী ফিরে আসে, সুতরাং যদি এটির স্ট্রিং দেওয়া হয় তবে এটি কেবল সর্বশেষ বিকল্পটি বেছে নেবে (এবং এটি একটি সংখ্যায় রূপান্তর করবে)। ==ব্যবহারসমূহ ToNumberশুধুমাত্র ক্ষেত্রেই string == numberবা boolean == anything(এবং শুধুমাত্র উপরের string/ boolean)। এর অর্থ ==কখনই রূপান্তরিত হবে না undefinedবা nullধূসর বাক্সে থাকলেও। (হয় কোনো সমন্বয় জন্য undefinedঅথবা nullঅথবা উভয়, ==সবসময় ফিরে আসবে trueএছাড়াও, কোনো একটি মান ব্যাপার না বাম বা ডান দিকে থাকে। ==(এবং ===) একই ফলাফল আসতে হবে।)
user2033427

55

জাভাস্ক্রিপ্ট === বনাম ==

0==false   // true
0===false  // false, because they are of a different type
1=="1"     // true, auto type coercion
1==="1"    // false, because they are of a different type

54

এর অর্থ ধরণের ধরণের ধরণের বিন্যাস ছাড়াই সমতা মানে জাভাস্ক্রিপ্ট স্বয়ংক্রিয়ভাবে অন্য কোনও ডেটা ধরণের স্ট্রিং ডেটা ধরণে রূপান্তর করে না

0==false   // true,although they are different types

0===false  // false,as they are different types

2=='2'    //true,different types,one is string and another is integer but 
            javaScript convert 2 to string by using == operator 

2==='2'  //false because by using === operator ,javaScript do not convert 
           integer to string 

2===2   //true because both have same value and same types 

48

একটি সাধারণ স্ক্রিপ্টে কোনও পারফরম্যান্সের পার্থক্য থাকবে না। আরও গুরুত্বপূর্ণ এটি হতে পারে যে হাজার "===" হাজারের চেয়ে 1 কেবি ভারি "==" :) জাভাস্ক্রিপ্ট প্রোফাইলাররা আপনার ক্ষেত্রে পারফরম্যান্সের পার্থক্য রয়েছে কিনা তা আপনাকে বলতে পারবেন।

তবে ব্যক্তিগতভাবে আমি জেএসলিন্টের পরামর্শ অনুযায়ী যা করব। এই সুপারিশটি পারফরম্যান্স সমস্যার কারণে নয়, কারণ ধরণের জবরদস্তির অর্থ('\t\r\n' == 0) সত্য।


4
সর্বদা সত্য নয়। Gzip সংকোচনের সাথে, পার্থক্যটি প্রায় নগণ্য হবে।
ড্যানিয়েল এক্স মুর

1
সম্মত হন, তবে হাজার "===" এর অর্থ হ'ল 10 হাজার কোড লাইন অন্য যেহেতু 1kb আরও কম বা কম ...;)
জনি

আপনার আকার সম্পর্কে উদ্বিগ্ন তারপরে কেবল আপনার সমস্ত

46

সমান তুলনা অপারেটর == বিভ্রান্তিকর এবং এড়ানো উচিত।

আপনি যদি আছে এটি সঙ্গে বসবাস, তারপর নিম্নলিখিত 3 জিনিষ মনে রাখবেন:

  1. এটা তোলে সকর্মক নয়: (ক == খ) এবং (খ == গ) হতে না (ক == গ)
  2. এটি একেবারে অস্বীকার করার জন্য পারস্পরিক একচেটিয়া: (a == খ) এবং (ক! = বি) সবসময় এবং সমস্ত বি দিয়ে বুলিয়ান মানগুলির বিপরীতে থাকে।
  3. সন্দেহের ক্ষেত্রে নিম্নলিখিত সত্যের ছকটি হৃদয় দিয়ে শিখুন:

জাভাস্ক্রিপ্টে ইক্যুয়াল অপারেটর ট্র্যাচ টেবিল

  • সারণীর প্রতিটি সারি 3 পারস্পরিক "সমান" মানের একটি সেট, যার মধ্যে যে কোনও 2 টি মান সমান == চিহ্ন * ব্যবহার করে সমান

** স্ট্রাগ করুন: নোট করুন যে প্রথম কলামের কোনও দুটি মান সেই অর্থে সমান নয় * **

''       == 0 == false   // Any two values among these 3 ones are equal with the == operator
'0'      == 0 == false   // Also a set of 3 equal values, note that only 0 and false are repeated
'\t'     == 0 == false   // -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
'\r'     == 0 == false   // -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
'\n'     == 0 == false   // -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
'\t\r\n' == 0 == false   // -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --

null == undefined  // These two "default" values are not-equal to any of the listed values above
NaN                // NaN is not equal to any thing, even to itself.

39

আপনার ব্যবহারে দুটি ক্রিয়াকলাপের মধ্যে কোনও পারফরম্যান্স পার্থক্য হওয়ার সম্ভাবনা নেই। দুটি ধরণের পরামিতি ইতিমধ্যে একই ধরণের হয়ে যাওয়ার জন্য কোনও ধরণের রূপান্তরকরণ নেই। উভয় ক্রিয়াকলাপে একটি মান তুলনা এবং তারপরে একটি ধরণের তুলনা থাকবে।


38

হ্যাঁ! এটা ব্যাপার।

===জাভাস্ক্রিপ্টে অপারেটর মান পরীক্ষা করে সেই সাথে টাইপ করুন যেখানে ==অপারেটর কেবল মানটি পরীক্ষা করে (প্রয়োজনে রূপান্তরটি টাইপ করে)

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

আপনি এটি সহজে পরীক্ষা করতে পারেন। এইচটিএমএল ফাইলে নিম্নলিখিত কোডটি আটকান এবং এটি ব্রাউজারে খুলুন

<script>

function onPageLoad()
{
    var x = "5";
    var y = 5;
    alert(x === 5);
};

</script>

</head>

<body onload='onPageLoad();'>

আপনি ' মিথ্যা পাবেন সতর্কতার সাথে ' । এখন আপনি onPageLoad()পদ্ধতিটি পরিবর্তন করুন সত্য হবেalert(x == 5);


33

=== অপারেটর মানগুলির পাশাপাশি সমতার জন্য ভেরিয়েবলের প্রকারগুলি পরীক্ষা করে।

== অপারেটর সাম্যতার জন্য কেবল ভেরিয়েবলের মান পরীক্ষা করে।


32

এটি একটি কঠোর চেক পরীক্ষা।

এটি একটি ভাল জিনিস বিশেষত যদি আপনি 0 এবং মিথ্যা এবং নাল মধ্যে পরীক্ষা করে থাকেন।

উদাহরণস্বরূপ, যদি আপনার:

$a = 0;

তারপর:

$a==0; 
$a==NULL;
$a==false;

সমস্ত রিটার্ন সত্য এবং আপনি এটি নাও চাইতে পারেন। ধরা যাক আপনার কাছে এমন একটি ফাংশন রয়েছে যা কোনও অ্যারের 0 তম সূচকটি ব্যর্থ করতে পারে বা ভুলতে পারে। যদি আপনি "==" মিথ্যা দিয়ে চেক করেন তবে আপনি একটি বিভ্রান্তিকর ফলাফল পেতে পারেন।

উপরের মত একই জিনিস সঙ্গে, কিন্তু একটি কঠোর পরীক্ষা:

$a = 0;

$a===0; // returns true
$a===NULL; // returns false
$a===false; // returns false

3
জাভাস্ক্রিপ্টে এটি সম্পূর্ণ ভুল এবং ভুলভাবে অসম্পূর্ণ। 0 != null। -1
রাই-

31

জেএসলিন্ট আপনাকে মাঝে মাঝে স্টাফ সংশোধন করার অবাস্তব কারণ দেয়। ===ঠিক একই কর্মক্ষমতা আছে==ধরণের ইতিমধ্যে একই রকমের ।

এটি কেবল তখনই দ্রুত হয় যখন প্রকারগুলি একই নয়, এক্ষেত্রে এটি ধরণের রূপান্তরিত করার চেষ্টা করে না তবে সরাসরি কোনও মিথ্যা দেয়।

সুতরাং, আইএমএইচও, জেএসলিন্ট সম্ভবত নতুন কোড লিখতে ব্যবহার করেছেন তবে অকেজো ওভার-অপটিমাইজিং সব ক্ষেত্রে এড়ানো উচিত।

অর্থ, যখন আপনি এটি সত্যরূপে জানেন যে কোনওটি কেবল স্ট্রিং হতে পারে তখন চেক পরিবর্তন ==করার কোনও কারণ নেই ।===if (a == 'test')

অনেক কোড সংশোধন করা হচ্ছে যেভাবে বিকাশকারীদের এবং পর্যালোচকদের সময় অপচয় করে এবং কিছুই অর্জন করে না।


30

কেবল

==এর সাথে অপারেশনগুলির মধ্যে তুলনা type conversion

&

===মানে তুলনা operands মধ্যে ছাড়া type conversion

জাভাস্ক্রিপ্টে টাইপ রূপান্তর অর্থ জাভা স্ক্রিপ্ট স্বয়ংক্রিয়ভাবে অন্য কোনও ডেটা ধরণের স্ট্রিং ডেটা ধরণে রূপান্তর করে।

উদাহরণ স্বরূপ:

123=='123'   //will return true, because JS convert integer 123 to string '123'
             //as we used '==' operator 

123==='123' //will return false, because JS do not convert integer 123 to string 
            //'123' as we used '===' operator 

26

একটি সহজ উদাহরণ

2 == '2'  -> true, values are SAME because of type conversion.

2 === '2'  -> false, values are NOT SAME because of no type conversion.

25

উল্লিখিত শীর্ষস্থানীয় দুটি উত্তর == এর অর্থ সমতা এবং === মানে পরিচয়। দুর্ভাগ্যক্রমে, এই বিবৃতিটি ভুল।

যদি উভয় অপারেন্ট == বস্তু হয় তবে তাদের তুলনা করা হয় তারা একই বস্তু কিনা তা দেখার সাথে। যদি উভয় অপারেন্ড একই বস্তুর দিকে নির্দেশ করে তবে সমান অপারেটরটি সত্য করে দেয়। অন্যথায়, দুটি সমান নয়।

var a = [1, 2, 3];  
var b = [1, 2, 3];  
console.log(a == b)  // false  
console.log(a === b) // false  

উপরের কোডে, উভয় == এবং === মিথ্যা হয়ে যায় কারণ ক এবং খ একই জিনিস নয়।

বলার অপেক্ষা রাখে না: যদি == উভয় অপারেশনগুলি বস্তু হয়, == === এর মতো আচরণ করে, যার অর্থ পরিচয় means এই দুটি অপারেটরের অপরিহার্য পার্থক্য টাইপ রূপান্তর সম্পর্কে। সমতা যাচাই করার আগে == এর রূপান্তর আছে তবে === তা হয় না।


24

থাম্বের নিয়ম হিসাবে, আমি সাধারণত ===পরিবর্তে ==(এবং !==পরিবর্তে) ব্যবহার করব!= )।

উপরের উত্তরে কারণগুলি ব্যাখ্যা করা হয়েছে এবং ডগলাস ক্রকফোর্ডও এটি সম্পর্কে বেশ পরিষ্কার ( জাভাস্ক্রিপ্ট: দ্য গুড পার্টস )।

তবে একটি একক ব্যতিক্রম রয়েছে : == null'ইজ নাল বা অপরিজ্ঞাত' জন্য যাচাই করার একটি কার্যকর উপায়:

if( value == null ){
    // value is either null or undefined
}

উদাহরণস্বরূপ jQuery 1.9.1 43 বার এই প্যাটার্নটি ব্যবহার করে এবং JSHint সিনট্যাক্স পরীক্ষক এমনকি সরবরাহ করেeqnull এই কারণে শিথিলকরণ বিকল্প ।

থেকে jQuery এর শৈলী গাইড :

কঠোর সমতা চেক (===) == এর পক্ষে ব্যবহার করা উচিত। একমাত্র ব্যতিক্রম হ'ল নালার মাধ্যমে অপরিজ্ঞাত এবং নাল পরীক্ষা করার সময় checking

// Check for both undefined and null values, for some important reason. 
undefOrNull == null;

22

সমস্যাটি হ'ল আপনি সহজেই সমস্যায় পড়তে পারেন যেহেতু জাভাস্ক্রিপ্টের অনেকগুলি অন্তর্নিহিত রূপান্তর অর্থ ...

var x = 0;
var isTrue = x == null;
var isFalse = x === null;

যা খুব শীঘ্রই একটি সমস্যায় পরিণত হয়। কেন অন্তর্ভুক্ত রূপান্তর "দুষ্ট" এর সর্বোত্তম নমুনা এই কোড থেকে এমএফসি / সি ++ এ নেওয়া যেতে পারে যা আসলে সিএসস্ট্রিং থেকে হ্যান্ডলে রূপান্তরকারী সংকলনের কারণে সংকলিত হবে যা পয়েন্টার টাইপফ টাইপ ...

CString x;
delete x;

স্পষ্টতই রানটাইমের সময় খুব অপরিজ্ঞাত জিনিসগুলি করে ...

গুগল এর বিরুদ্ধে কিছু যুক্তি পেতে সি ++ এবং এসটিএলে অন্তর্নিহিত রূপান্তরগুলির জন্য ...


2
0 == nullমিথ্যা
গ্যারেট


21

সমতার তুলনা:

অপারেটর ==

সত্য দুটি, যখন উভয় অপারেশন সমান হয় ফিরে আসে। অপারেশনগুলি তুলনা করার আগে একই ধরণের রূপান্তরিত হয়।

>>> 1 == 1
true
>>> 1 == 2
false
>>> 1 == '1'
true

সমতা এবং ধরণের তুলনা:

অপারেটর ===

উভয় অপারেন্ড সমান এবং একই ধরণের হলে সত্যটি ফেরত দেয়। আপনি যদি এইভাবে তুলনা করেন তবে এটি সাধারণত ভাল এবং নিরাপদ, কারণ পর্দার মতো কোনও রূপান্তর নেই।

>>> 1 === '1'
false
>>> 1 === 1
true

20

এখানে একটি কুশলী তুলনা সারণি ধর্মান্তর যে ঘটতে এবং মধ্যে পার্থক্য দেখায় ==এবং ===

উপসংহারে বলা হয়েছে:

"দ্বি-সমতার জন্য সংঘটিত রূপান্তরগুলি আপনি পুরোপুরি বুঝতে না পারলে তিনটি সমান ব্যবহার করুন" "

http://dorey.github.io/JavaScript-Equality-Table/


20

নাল এবং অপরিজ্ঞাত হ'ল কিছুই নয়,

var a;
var b = null;

এখানে aএবং bমান নেই। যেখানে, 0, মিথ্যা এবং '' সমস্ত মান। এই সমস্তগুলির মধ্যে একটি সাধারণ বিষয় হ'ল এগুলি সমস্ত মিথ্যা মান, যার অর্থ তারা সকলেই মিথ্যা শর্ত পূরণ করে

সুতরাং, 0, মিথ্যা এবং '' একসাথে একটি উপ-গ্রুপ গঠন করে। এবং অন্যদিকে, নাল এবং অপরিবর্তিত দ্বিতীয় উপ-গ্রুপ গঠন করে। নীচের চিত্রের তুলনা পরীক্ষা করুন। নাল এবং অপরিজ্ঞাত সমান হবে। অন্য তিনটি একে অপরের সমান হবে। তবে, তাদের সকলকে জাভাস্ক্রিপ্টে মিথ্যা পরিস্থিতি হিসাবে বিবেচনা করা হয়।

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

এটি যে কোনও অবজেক্টের মতো (যেমন},, অ্যারে ইত্যাদি), খালি খালি স্ট্রিং এবং বুলিয়ান সত্য সব সত্যই শর্ত। তবে, তারা সবাই সমান নয়।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.