জাভাস্ক্রিপ্টে == ব্যবহার করা কি কোনও অর্থবোধ করে?


276

ইন জাভাস্ক্রিপ্ট, গুড যন্ত্রাংশ , ডগলাস Crockford লিখেছিলেন:

জাভাস্ক্রিপ্টে সমতা অপারেটরগুলির দুটি সেট রয়েছে: ===এবং !==, এবং তাদের দুষ্ট যুগল ==এবং !=। ভাল ব্যক্তিরা আপনার প্রত্যাশা অনুযায়ী কাজ করে। দুটি অপারেন্ড যদি একই ধরণের হয় এবং একই মান হয়, তবে ===উত্পাদন 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সাথে সমস্ত তুলনা স্রেফ দেখানো হয়েছে ===

এই দ্ব্যর্থহীন পর্যবেক্ষণ দেওয়া, এমন কি এমন কোনও সময় আছে যখন ব্যবহার করা ==আসলে যথাযথ হতে পারে?


11
এটা তোলে ইন্দ্রিয় তোলে স্থান প্রচুর হবে। যে কোনও সময় আপনি একই ধরণের দুটি জিনিসের সাথে তুলনা করছেন (এটি আমার অভিজ্ঞতায় অনেক কিছু ঘটে), == বনাম === কেবল নীচে নেমে আসে। অন্যান্য সময় আপনি আসলে বিমূর্ত তুলনা চান (যেমনটি আপনি নিজের উত্তরে উল্লেখ করেছেন)। এটি উপযুক্ত কিনা তা কোনও প্রদত্ত প্রকল্পের সম্মেলনের উপর নির্ভর করে।
আরে

4
"প্রচুর জায়গাগুলি" সম্পর্কিত, আমার অভিজ্ঞতার সাথে এমন ঘটনাগুলি যেখানে এটির চেয়ে বেশি সংখ্যক ক্ষেত্রে বিবেচনা করে না। আপনার অভিজ্ঞতা ভিন্ন হতে পারে; বিভিন্ন ধরণের প্রকল্পের সাথে আমাদের অভিজ্ঞতা থাকতে পারে। আমি যখন ==ডিফল্টরূপে ব্যবহার করা প্রকল্পগুলি দেখি , তখন ===দাঁড়িয়ে থাকে এবং গুরুত্বপূর্ণ কিছু চলছে তা আমাকে জানতে দেয়।
ওহে

4
আমি মনে করি না যে জাভাস্ক্রিপ্ট এটির ধরণের চাপের সাথে যথেষ্ট পরিমাণে যায়। বিএস ভাষার মতো এটিতে আরও বেশি ধরণের জবরদস্তি বিকল্প থাকা উচিত ।
মার্ক বুথ

5
আমি যে জায়গাটি ব্যবহার করি == তা হ'ল ড্রপডাউন আইডি'র (যা সর্বদা চর থাকে) মডেল আইডি'র সাথে (যা সাধারণত অন্তর্নিহিত) থাকে।
স্কটি

11
@ ডেভসোলার ওয়েব ডেভলপমেন্টটি তখন উপলব্ধি করে যখন আপনি 15 টি প্ল্যাটফর্মের জন্য একটি নেটিভ অ্যাপ্লিকেশন তৈরি করার সাথে সাথে প্রতিটি প্ল্যাটফর্মের একচেটিয়া অ্যাপ স্টোরের শংসাপত্রের সাথে সাক্ষাত করতে চান না।
দামিয়ান ইয়ারিক

উত্তর:


232

আমি একটি যুক্তি তৈরি করতে যাচ্ছি ==

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

জাভাস্ক্রিপ্ট একটি আচরণগতভাবে * টাইপ করা ভাষা। জিনিসগুলি তারা কী করতে পারে তার ভিত্তিতে চিকিত্সা করা হয় এবং তাদের প্রকৃত ধরণের নয়। এজন্য আপনি .mapকোনও নোডলিস্টে বা একটি jQuery নির্বাচনের সেটটিতে অ্যারের পদ্ধতিকে কল করতে পারেন । এটি আপনি কেন করতে 3 - "5"এবং অর্থবহ কিছু পেতে পারেন তাও - কারণ "5" একটি সংখ্যার মতো কাজ করতে পারে।

যখন আপনি একটি সঞ্চালন ==সমতা আপনি তুলনা করা হয় বিষয়বস্তু বরং তার চেয়ে ভেরিয়েবলের টাইপ । এখানে কয়েকটি ক্ষেত্রে এটি কার্যকর হয়:

  • ব্যবহারকারীর কাছ থেকে একটি নম্বর পড়া - ডিওমে .valueকোনও ইনপুট উপাদানটির পড়ুন? সমস্যা নেই! আপনাকে এটিকে ingালাই বা এটির ধরণের বিষয়ে চিন্তা করা শুরু করতে ==হবে না - আপনি এখনই এটি সংখ্যায় পেতে পারেন এবং অর্থপূর্ণ কিছু পেতে পারেন।
  • ঘোষিত ভেরিয়েবলের "অস্তিত্ব" পরীক্ষা করা দরকার? - আপনি == nullএটি করতে পারেন যেহেতু আচরণগতভাবে nullপ্রতিনিধিত্ব করে সেখানে কিছুই নেই এবং অপরিবর্তিত সেখানেও কিছু নেই।
  • আপনি কোনও ব্যবহারকারীর কাছ থেকে অর্থবহ ইনপুট পেয়েছেন কিনা তা খতিয়ে দেখা দরকার? - ==আর্গুমেন্টের সাথে ইনপুটটি মিথ্যা কিনা তা পরীক্ষা করুন , এটি ব্যবহারকারী আপনার জন্য কিছুই বা কেবল শ্বেত-স্থান প্রবেশ করায় না এমন ক্ষেত্রে এটি আচরণ করবে যা সম্ভবত আপনার প্রয়োজন।

আসুন ক্রকফোর্ডের উদাহরণগুলি দেখুন এবং তাদের আচরণগতভাবে ব্যাখ্যা করুন:

'' == '0'           // got input from user vs. didn't get input - so false
0 == ''             // number representing empty and string representing empty - so true
0 == '0'            // these both behave as the number 0 when added to numbers - so true    
false == 'false'    // false vs got input from user which is truthy - so false
false == '0'        // both can substitute for 0 as numbers - so again true

false == undefined  // having nothing is not the same as having a false value - so false
false == null       // having empty is not the same as having a false value - so false
null == undefined   // both don't represent a value - so true

' \t\r\n ' == 0     // didn't get meaningful input from user vs falsey number - true 

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

* কেউ কেউ নামের কাঠামোগত টাইপিং পছন্দ করতে পারেন যা বেশি সাধারণ তবে একটি পার্থক্য রয়েছে - এখানে পার্থক্যটি নিয়ে আলোচনা করতে সত্যই আগ্রহী নয়।


8
এটি একটি দুর্দান্ত উত্তর, এবং আমি আপনার তিনটি '==' ব্যবহারের ক্ষেত্রে ব্যবহার করি। # 1 এবং # 3 বিশেষভাবে দরকারী।
ক্রিস সাইরেফাইস

223
সমস্যাটি ==এমন নয় যে এর তুলনাগুলির কোনওটিই কার্যকর নয় , নিয়মগুলি মনে রাখা অসম্ভব তাই আপনি প্রায় ভুল করার নিশ্চয়তা পান। উদাহরণস্বরূপ: "আপনি কোনও ব্যবহারকারীর কাছ থেকে অর্থপূর্ণ ইনপুট পেয়েছেন কিনা তা খতিয়ে দেখা দরকার?", তবে '0' একটি অর্থবহ ইনপুট এবং '0'==falseসত্য। আপনি যদি ব্যবহার করে থাকেন তবে ===আপনাকে সে সম্পর্কে স্পষ্টভাবে চিন্তা করতে হবে এবং আপনি ভুল করবেন না।
টিম্ম্ম্ম

44
"বিধিগুলি মনে রাখা অসম্ভব" <== এটি এমন এক জিনিস যা আমাকে জাভাস্ক্রিপ্টে "অর্থপূর্ণ" কিছু করতে দূরে সরিয়ে দেয়। (এবং ভাসমান গণিত যা বুনিয়াদি ক্যালক সংক্ষিপ্তসারগুলিতে সমস্যা সৃষ্টি করে)
ওয়ার্নারসিডি

9
3 - "5"উদাহরণস্বরূপ তার নিজের উপর একটি ভাল পয়েন্ট উত্থাপন: এমনকি আপনি যদি একচেটিয়াভাবে ব্যবহার ===তুলনা জন্য, যে মাত্র উপায় ভেরিয়েবল জাভাস্ক্রিপ্ট কাজ আছে। এটি থেকে সম্পূর্ণরূপে পালানোর কোনও উপায় নেই।
জ্যারেট মিল্লার্ড

23
@ টিএমএমএম নোট আমি এখানে শয়তানের উকিল খেলছি। আমি ==আমার নিজস্ব কোড ব্যবহার করি না , আমি এটি একটি বিরোধী-প্যাটার্ন হিসাবে পেয়েছি এবং আমি পুরোপুরি সম্মত হই যে বিমূর্ত সমতা অ্যালগরিদম মনে রাখা কঠিন। আমি এখানে যা করছি তা লোকদের পক্ষে যুক্তি তৈরি করছে making
বেনিয়ামিন গ্রুইনবাউম

94

দেখা যাচ্ছে যে jQuery কনস্ট্রাক্ট ব্যবহার করে

if (someObj == null) {
  // do something
}

সমতুল্য কোডের জন্য সংক্ষিপ্ত রূপ হিসাবে:

if ((someObj === undefined) || (someObj === null))  {
  // do something
}

এটি ECMAScript ভাষা নির্দিষ্টকরণের একটি পরিণতি § 11.9.3, অ্যাবস্ট্রাক্ট ইক্যুয়ালিটি তুলনা অ্যালগরিদম , যা অন্যান্য বিষয়গুলির মধ্যে উল্লেখ করে যে,

1.  If Type(x) is the same as Type(y), then  
    a.  If Type(x) is Undefined, return true.  
    b.  If Type(x) is Null, return true.

এবং

2.  If x is null and y is undefined, return true.
3.  If x is undefined and y is null, return true.

এই নির্দিষ্ট কৌশলটি যথেষ্ট সাধারণ যে জেএসহিন্টের নির্দিষ্টভাবে এটির জন্য ডিজাইন করা একটি পতাকা রয়েছে ।


10
আপনার নিজের প্রশ্নের উত্তর দেওয়া কোনও ন্যায্য নয় আমি এর উত্তর দিতে চেয়েছিলাম :) == null or undefinedআমি একমাত্র এমন জায়গা যেখানে আমি ব্যবহার করি না ===বা!==
5:40

26
ফর্সা jQuery হতে খুব কমই একটি মডেল কোডবেস হয়। JQuery উত্সটি বেশ কয়েকবার পড়ার পরে অনেকগুলি নেস্টেড টেরিনারি, অস্পষ্ট বিট, নেস্টিং এবং আমি অন্যথায় বাস্তব কোড এড়াতে পারি এমন জিনিসগুলির সাথে এটি আমার সর্বনিম্ন প্রিয় কোডবাসগুলির মধ্যে একটি। যদিও এর জন্য আমার শব্দটি গ্রহণ করবেন না - এটি github.com/jquery/jquery/tree/master/src পড়ুন এবং তারপরে এটি জেপটোর সাথে তুলনা করুন যা একটি jQuery ক্লোন: github.com/madrobby/zepto/tree/master/src
বেনজামিন গ্রুইনবাউম

4
আরও মনে রাখবেন যে জেপ্টো ডিফল্ট হিসাবে মনে হচ্ছে ==এবং কেবল ===এটির ক্ষেত্রে প্রয়োজন ব্যবহার করে: github.com/madrobby/zepto/blob/master/src/event.js
আরে

2
@ হ্যাঁ সুষ্ঠু হওয়া জেপ্টো খুব কমই মডেল কোডবেস - এটি __proto__মোবাইল ওয়েবসাইট ভঙ্গ করা এড়ানোর জন্য ভাষা এককভাবে প্রায় এককভাবে এটি জোর করে বলার জন্য কুখ্যাত ।
বেনিয়ামিন গ্রুইনবাউম

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

15

মূল্যবোধ পরীক্ষা করা nullবা undefinedএকটি জিনিস, যেমন প্রচুরভাবে ব্যাখ্যা করা হয়েছে।

আরও একটি জিনিস আছে, যেখানে ==জ্বলজ্বল করে:

আপনি তুলনাটি >=পছন্দ থেকে পছন্দ করতে পারেন (লোকেরা সাধারণত শুরু করে >তবে আমি এটি আরও মার্জিত মনে করি):

  • a > b <=> a >= b && !(b >= a)
  • a == b <=> a >= b && b >= a
  • a < bএবং a <= bপাঠকের কাছে অনুশীলন হিসাবে রেখে দেওয়া হয়।

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

সুতরাং সম্পর্কে সত্যিই ভাল জিনিস ==এটি অন্যান্য সমস্ত সম্পর্কের সাথে সামঞ্জস্যপূর্ণ। এটি অন্যভাবে বলতে, যদি আপনি এটি লিখেন:

function compare(a, b) {
  if (a > b) return 1;
  if (a < b) return -1;
  return 0;
}

আপনি ==ইতিমধ্যে ইতিমধ্যে ব্যবহার করছেন ।

এখন এর বেশিরভাগ সম্পর্কিত প্রশ্নের সাথে: সংখ্যাটি এবং স্ট্রিং এর তুলনামূলকভাবে এটি প্রয়োগ করার উপায়টি কি খারাপ পছন্দ ছিল? বিচ্ছিন্নভাবে দেখা, এটি করা বরং একটি বোকামি জিনিস বলে মনে হচ্ছে। তবে জাভাস্ক্রিপ্ট এবং ডিওএম এর অন্যান্য অংশগুলির প্রসঙ্গে, এটি তুলনামূলকভাবে বাস্তববাদী, এটি বিবেচনা করে:

  • বৈশিষ্ট্য সবসময় স্ট্রিং হয়
  • কীগুলি সর্বদা স্ট্রিং থাকে (ব্যবহারের ক্ষেত্রে আপনি Objectঅন্তর থেকে মানগুলিতে বিচ্ছুরিত মানচিত্র রাখার জন্য ব্যবহার করেন )
  • ব্যবহারকারীর ইনপুট এবং ফর্ম নিয়ন্ত্রণ মানগুলি সর্বদা স্ট্রিং থাকে (উত্সের সাথে মিল থাকলেও input[type=number])

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


4
ন্যায্য >=হওয়া আসলেই ক্ষণস্থায়ী নয়। জেএসে এটি বেশ সম্ভব যা a > bনাও হয় a < bনা b == a(উদাহরণস্বরূপ NaN:)।
বেনিয়ামিন গ্রুইনবাউম

8
@ বেনজামিন গ্রুয়েনবাউম: এটি বলার মতো ঘটনাটি +আসলেই চতুর নয়, কারণ NaN + 5 == NaN + 5এটি ধারণ করে না। >=মুল বক্তব্যটি হ'ল সংখ্যা-ইশ মানগুলির সাথে কাজ করে যার জন্য ==ধারাবাহিকভাবে কাজ করে। অবাক হওয়ার কিছু নেই যে "সংখ্যার নয়" এটি তার প্রকৃতির দ্বারা সংখ্যা-ইশ নয়;)
ব্যাক

4
এর খারাপ ব্যবহারের ==সাথে কি এই দুর্বল আচরণের সাথে সামঞ্জস্য রয়েছে >=? দুর্দান্ত, এখন আমি চাই একটি >==...
এল্ড্রিচ কনড্রাম

2
@ এল্ড্রিচকনড্রাম: আমি যেমন ব্যাখ্যা করার চেষ্টা করেছি, এর আচরণ >=বাকী ভাষা / স্ট্যান্ডার্ড এপিআইয়ের সাথে বরং সামঞ্জস্যপূর্ণ। এর সামগ্রিকতায় জাভাস্ক্রিপ্টটি এর স্পর্শকাতর অংশের যোগফলের চেয়ে বেশি হতে পারে। আপনি যদি একটি চান >==, আপনি কি একটি কঠোর চান +? বাস্তবে, এই সিদ্ধান্তগুলির মধ্যে অনেকগুলি অনেক কিছুই সহজ করে তোলে। সুতরাং আমি তাদের দরিদ্র হিসাবে বিচার করতে ছুটে যাব না।
back2dos

2
@ এল্ড্রিচকনুন্ড্রাম: আবার: রিলেশনশিপ অপারেটরগুলি সংখ্যার মানগুলির সাথে তুলনা করতে বোঝানো হয়, যেখানে কোনও অপারেন্ড আসলে স্ট্রিং হতে পারে। অপরেনড প্রকারের জন্য যার >=অর্থবোধক, ==সমান অর্থবহ - এগুলিই। কেউ আপনার [[]]সাথে তুলনা করা উচিত বলে না false। সি এর মতো ভাষায় এই স্তরের বাজে ফলাফলের সংজ্ঞা দেওয়া হয় না। কেবল এটির মতোই আচরণ করুন: এটি করবেন না। এবং আপনি ভাল থাকবেন। আপনার কোনও যাদু নিয়ম মনে রাখার দরকার পড়বে না। এবং তারপর এটি আসলে বরং সরাসরি এগিয়ে।
back2dos

8

একটি পেশাদারী গণিতজ্ঞ আমি দেখতে Javscript এর অভিন্নতা অপারেটর == (এছাড়াও "বিমূর্ত তুলনা", "আলগা সমতা" বলা একটি বিল্ড করার একটি প্রয়াস) সমানতা সম্পর্ক সত্ত্বা মধ্যে, যা হচ্ছে অন্তর্ভুক্ত আত্মবাচক , প্রতিসম এবং সকর্মক । দুর্ভাগ্যক্রমে, এই তিনটি মৌলিক বৈশিষ্ট্যের মধ্যে দুটি ব্যর্থ:

==প্রতিবিম্বিত নয় :

A == A যেমন মিথ্যা হতে পারে, যেমন

NaN == NaN // false

==অস্থির নয় :

A == Bএবং B == Cএকসাথে বোঝানো হয় না A == C, যেমন

'1' == 1 // true
1 == '01' // true
'1' == '01' // false

শুধুমাত্র প্রতিসম সম্পত্তি বেঁচে থাকে:

A == Bবোঝানো হয় B == A, কোন লঙ্ঘন সম্ভবত কোনও অবস্থাতেই কল্পনাতীত এবং গুরুতর বিদ্রোহের দিকে পরিচালিত করবে;)

সমতা সম্পর্কের বিষয়টি কেন?

কারণ এটি সবচেয়ে গুরুত্বপূর্ণ এবং প্রচলিত প্রকারের সম্পর্ক, অসংখ্য উদাহরণ এবং অ্যাপ্লিকেশন দ্বারা সমর্থিত। সর্বাধিক গুরুত্বপূর্ণ অ্যাপ্লিকেশন হ'ল সমতা শ্রেণিতে সংস্থাগুলি পচে যাওয়া , যা সম্পর্ককে বোঝার নিজেই একটি খুব সুবিধাজনক এবং স্বজ্ঞাত উপায়। এবং সমতুল্য হতে ব্যর্থতা সমতুল্য শ্রেণীর অভাবের দিকে পরিচালিত করে, যার ফলস্বরূপ স্বজ্ঞাত এবং অপ্রয়োজনীয় জটিলতার অভাব দেখা দেয়।

==অ-সমতা সম্পর্কের জন্য লিখতে কেন এমন ভয়াবহ ধারণা ?

কারণ এটি আমাদের পরিচিতি এবং অন্তর্দৃষ্টি ভঙ্গ করে, আক্ষরিক অর্থে মিল, সাম্যতা, একত্রিতকরণ, আইসোমরফিজম, পরিচয় ইত্যাদির কোনও আকর্ষণীয় সম্পর্ক একটি সমতা।

রূপান্তর টাইপ করুন

স্বজ্ঞাত সমতুল্যের উপর নির্ভর করার পরিবর্তে জাভাস্ক্রিপ্ট প্রকার রূপান্তরটি প্রবর্তন করে:

সমতা অপারেটর অপারেন্ডগুলিকে রূপান্তর করে যদি তারা একই ধরণের না হয়, তবে কঠোর তুলনা প্রয়োগ করে।

তবে ধরণের রূপান্তর কীভাবে সংজ্ঞায়িত হয়? বিভিন্ন ব্যতিক্রম সহ জটিল নিয়মের একটি সেট মাধ্যমে?

সমতুল্য সম্পর্ক গড়ে তোলার চেষ্টা করা

Booleans। স্পষ্টত trueএবং falseএকই নয় এবং বিভিন্ন শ্রেণিতে হওয়া উচিত।

নাম্বার। ভাগ্যক্রমে, সংখ্যার সাম্যতা ইতিমধ্যে সুস্পষ্টভাবে সংজ্ঞায়িত করা হয়েছে, যেখানে দুটি পৃথক সংখ্যা কখনও একই সমতুল্য শ্রেণিতে হয় না। গণিতে, তা। জাভাস্ক্রিপ্টে সংখ্যা ধারণা কিছুটা বিকৃত আরো বহিরাগত উপস্থিতিতে মাধ্যমে -0, Infinityএবং -Infinity। আমাদের গাণিতিক স্বজ্ঞা dictates যে 0এবং -0একই শ্রেণীতে হওয়া উচিত (আসলে -0 === 0হয় true), যেহেতু অসীমতার প্রতিটি আলাদা বর্গ।

নম্বর এবং বুলিয়ান। নম্বর ক্লাস দেওয়া, আমরা বুলিয়ান কোথায় রাখব? falseএর সাথে 0সাদৃশ্য trueহয়ে যায় , যেখানে 1অন্যের মতো হয় তবে একই রকম হয় :

true == 1 // true
true == 2 // false

কোনো মানে হয় এখানে রাখুন হয় trueএকসাথে 1? স্বীকৃতভাবে 1পৃথক করা হয়, কিন্তু তাই হয় -1। আমি ব্যক্তিগতভাবে রূপান্তর trueকরার কোনও কারণ দেখতে পাচ্ছি না 1

এবং এটি আরও খারাপ হয়:

true + 2 // 3
true - 1 // 0

সুতরাং trueপ্রকৃতপক্ষে 1সমস্ত সংখ্যার মধ্যে রূপান্তরিত হয় ! এটা কি যৌক্তিক? এটা স্বজ্ঞাত? উত্তরটি অনুশীলন হিসাবে রেখে গেছে;)

তবে এ সম্পর্কে কী:

1 && true // true
2 && true // true

শুধুমাত্র বুলিয়ান xসঙ্গে x && trueহচ্ছে trueহয় x = true। যা প্রমাণ করে যে উভয় 1এবং 2(এবং অন্য কোনও সংখ্যা 0) উভয়ই রূপান্তর করে true! এটি যা দেখায় তা হ'ল আমাদের রূপান্তরটি আরেকটি গুরুত্বপূর্ণ সম্পত্তি ব্যর্থ করে - হ'ল বাইজেশন । অর্থ দুটি পৃথক সত্তা একই একতে রূপান্তর করতে পারে। যা নিজে থেকেই বড় সমস্যা হতে হবে না। বড় সমস্যা দেখা দেয় যখন আমরা এই রূপান্তরটি ব্যবহার করি যা আমরা যাকে বলতে চাই তার "অনুরূপতা" বা "আলগা সমতা" এর একটি সম্পর্ক বর্ণনা করতে। তবে একটি বিষয় স্পষ্ট - এটি কোনও সমতার সম্পর্ক হতে যাচ্ছে না এবং এটি সমতুল্য শ্রেণীর মাধ্যমে স্বজ্ঞাতভাবে বর্ণনা করা হবে না।

তবে আমরা কি আরও ভাল করতে পারি?

কমপক্ষে গাণিতিকভাবে - অবশ্যই হ্যাঁ! বুলিয়ান এবং সংখ্যার মধ্যে একটি সাধারণ সমতা সম্পর্ক কেবল falseএবং 0একই শ্রেণিতে থাকার সাথে নির্মিত হতে পারে । সুতরাং false == 0একমাত্র তুচ্ছ looseিলা সমতা হবে।

স্ট্রিং সম্পর্কে কি?

আমরা গোড়া স্পেসগুলি থেকে শুরুতে এবং শেষে সংখ্যায় রূপান্তর করতে স্ট্রিংগুলি ছাঁটাতে পারি, এছাড়াও আমরা সামনে শূন্যগুলি উপেক্ষা করতে পারি:

'   000 ' == 0 // true
'   0010 ' == 10 // true

সুতরাং আমরা একটি স্ট্রিংয়ের জন্য একটি সহজ নিয়ম পাই - সামনে শ্বেতস্থান এবং শূন্যগুলি ছাঁটাই। হয় আমরা একটি নম্বর বা খালি স্ট্রিং পাই, এক্ষেত্রে আমরা সেই নম্বর বা শূন্যে রূপান্তর করি। অথবা আমরা একটি নম্বর পাই না, সেই ক্ষেত্রে আমরা রূপান্তর করি না এবং তাই কোনও নতুন সম্পর্ক পাই না।

এইভাবে আমরা বুলিয়ানস, সংখ্যা এবং স্ট্রিংয়ের মোট সেটটিতে একটি নিখুঁত সমতুল্য সম্পর্ক পেতে পারি! তা বাদে ... জাভাস্ক্রিপ্ট ডিজাইনারদের স্পষ্টতই অন্য একটি মতামত রয়েছে:

' ' == '' // false

সুতরাং যে দুটি স্ট্রিং উভয়ই রূপান্তরিত করে 0তা হঠাৎ অ-অনুরূপ! কেন বা কেন? নিয়ম অনুসারে, স্ট্রিংগুলি সুনির্দিষ্টভাবে সমান হয় যখন তারা কঠোরভাবে সমান হয়! এই নিয়মটি আমরা দেখতে পেলাম কেবল সংক্রমণকেই ভেঙে দেয় তা নয়, এটি অনর্থকও! অন্য অপারেটরটিকে একে অপরের ==সাথে একেবারে সাদৃশ্যপূর্ণ করার জন্য কী লাভ ===?

উপসংহার

আলগা সাম্য অপারেটরটি ==যদি কিছু মৌলিক গাণিতিক আইন মেনে চলত তবে খুব কার্যকর হতে পারত। তবে এটি দুঃখজনকভাবে হয় না, এর উপযোগিতা ভোগ করে।


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

@ সলোমনউকো NaNখারাপ নাগরিক হিসাবে কাজ করে :-)। স্বীকৃতি বা স্বীকৃতি যে কোনও সমতুল্য তুলনার জন্য বহাল রাখা উচিত, স্বজ্ঞাত বা না।
দিমিত্রি জইতসেভ

7

হ্যাঁ, আমি এটির জন্য একটি ব্যবহারের ক্ষেত্রে জুড়ে চলেছি, যখন আপনি কোনও সংখ্যার মানের সাথে কোনও কীটির তুলনা করছেন :

for (var key in obj) {
    var some_number = foo(key, obj[key]);  // or whatever -- this is just an example
    if (key == some_number) {
        blah();
    }
}

আমি মনে করি তুলনা সম্পাদন করা অনেক বেশি স্বাভাবিক key == some_numberকারণ হিসাবে Number(key) === some_numberবা হিসাবে করা হয় না key === String(some_number)


3

আমি আজ একটি দুর্দান্ত দরকারী অ্যাপ্লিকেশন জুড়ে দৌড়ে। আপনি যদি প্যাডযুক্ত সংখ্যাগুলির তুলনা করতে চান, যেমন 01সাধারণ পূর্ণসংখ্যার মতো, ==ঠিক কাজ করে। উদাহরণ স্বরূপ:

'01' == 1 // true
'02' == 1 // false

এটি আপনাকে 0 অপসারণ করে এবং পূর্ণসংখ্যায় রূপান্তর করে সংরক্ষণ করে।


4
আমি নিশ্চিত যে এটি করার 'সঠিক' '04'-0 === 4parseInt('04', 10) === 4
উপায়টি

আপনি জানেন যে আমি এটা করতে পারি না।
জন স্নো

7
আমি অনেক যে পেতে.
জন স্নো

1
@ আর্টবাম বা+'01' === 1
এরিক লেগারগ্রেন

1
'011' == 011 // falseঅ-কঠোর মোডে এবং কঠোর মোডে সিন্ট্যাক্সেরর। :)
ব্রায়ান এস

3

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

p1.supervisor = 'Alice';
p2.supervisor = 'None';
p3.supervisor = null;
p4.supervisor = undefined;

এর অর্থ কী?

  • p1 একজন সুপারভাইজার রয়েছে যার নাম "অ্যালিস"।
  • p2 একজন সুপারভাইজার রয়েছে যার নাম "কিছুই নয়"।
  • p3স্পষ্টভাবে, দ্ব্যর্থহীনভাবে, একটি সুপারভাইজার নেই
  • p4সুপারভাইজার থাকতে পারে বা থাকতে পারে। আমরা জানি না, আমাদের যত্ন নেই, আমাদের (প্রাইভেসি ইস্যু?) জানা থাকার কথা নয়, কারণ এটি আমাদের ব্যবসায় নয়।

আপনি যখন ব্যবহার করবেন তখন আপনি ==বিবাদ করছেন nullএবং undefinedযা পুরোপুরি অনুচিত। দুটি পদ বলতে সম্পূর্ণ ভিন্ন জিনিস বোঝায়! আমার সুপারভাইজার নেই বলে এই বলে যে আমার সুপারভাইজারটি ভুল তা আমি আপনাকে বলতে অস্বীকার করেছি!

আমি বুঝতে পারি এমন প্রোগ্রামাররা আছেন যারা এই পার্থক্যটির বিষয়ে চিন্তা করেন না nullএবং undefinedএই শর্তগুলি আলাদাভাবে ব্যবহার করতে পছন্দ করেন না। আর তোমার বিশ্বের ব্যবহার করেন না nullএবং undefinedসঠিকভাবে, অথবা আপনি এই শর্তাদিতে আপনার নিজের ব্যাখ্যা দিতে ইচ্ছুক, তাই এটি করা আবশ্যক। যদিও আমি এটি একটি ভাল ধারণা মনে করি না।

এখন যাইহোক আমার কোনও সমস্যা নেই nullএবং undefinedউভয়ই মিথ্যা বলে! বলা একেবারে ঠিক okay

if (p.supervisor) { ... }

এবং তারপরে nullএবং undefinedতদারকির প্রক্রিয়াজাতকরণের কোডটি বাদ দেওয়া হবে। এটি সঠিক, কারণ আমরা জানি না বা তত্ত্বাবধায়ক নেই। সব ভালো. তবে দুটি পরিস্থিতি সমান নয় । এই কারণেই ==ভুল। আবার জিনিসগুলি মিথ্যা হতে পারে এবং হাঁসের টাইপিং অর্থে ব্যবহৃত হতে পারে, যা গতিশীল ভাষার জন্য দুর্দান্ত। এটি যথাযথ জাভাস্ক্রিপ্ট, পাইথোনিক, রুবিশ ইত্যাদি But তবে আবার, এই জিনিসগুলি সমান নয়।

: এবং আমাকে অ transitivity শুরু পাবেন না "0x16" == 10, 10 == "10"কিন্তু না "10" == "0x16"। হ্যাঁ, জাভাস্ক্রিপ্ট দুর্বল ধরনের। হ্যাঁ, এটা জবরদস্তিপূর্ণ। কিন্তু জবরদস্তি কখনও কখনও সাম্যের ক্ষেত্রে প্রযোজ্য না।

যাইহোক, ক্রকফোর্ডের দৃ strong় মতামত রয়েছে। তবে আপনি কি জানেন? তিনি এখানে সঠিক!

FWIW আমি বুঝতে পারি যে সেখানে আছে এবং আমি ব্যক্তিগতভাবে ==এমন পরিস্থিতিতে পৌঁছেছি যেখানে সুবিধাজনক! সংখ্যার জন্য স্ট্রিং ইনপুট নেওয়ার মতো এবং বলুন, 0 এর সাথে তুলনা করুন তবে এটি হ্যাক। বিশ্বের একটি সঠিক মডেলের জন্য ট্রেড অফ হিসাবে আপনার সুবিধা রয়েছে।

টিএল; ডিআর: মিথ্যাচার একটি দুর্দান্ত ধারণা। এটি সমতা প্রসারিত করা উচিত নয়।


বিভিন্ন পরিস্থিতি প্রদর্শনের জন্য আপনাকে ধন্যবাদ :) তবে, আপনি নিখোঁজ রয়েছেন p5... typeof(p5.supervisor) === typeof(undefined)যেখানে সুপারভাইজার ধারণা হিসাবে
উপস্থিতও
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.