(NaN! = NaN) এবং (NaN! == NaN) মধ্যে পার্থক্য কী?


148

সবার আগে আমি উল্লেখ করতে চাই যে আমি জানি কীভাবে isNaN()এবং কীভাবে Number.isNaN()কাজ করে। আমি পড়ছি ডেভিড ফ্লানাগনের ডিফিনিট গাইডটি এবং মানটি কীভাবে তা পরীক্ষা করতে হয় সে জন্য তিনি একটি উদাহরণ দেন NaN:

x !== x

এর ফলাফলটি trueযদি হয় এবং কেবল যদি xহয় NaN

তবে এখন আমার একটি প্রশ্ন আছে: তিনি কেন কঠোর তুলনা ব্যবহার করেন? কারণ মনে হয়

x != x

একইভাবে আচরণ করে উভয় সংস্করণ ব্যবহার করা কি নিরাপদ, বা আমি জাভাস্ক্রিপ্টে কিছু মান (গুলি) মিস করছি যা এর trueজন্য x !== xএবং এর falseজন্য ফিরে আসবে x != x?


10
এটি এমন হতে পারে যে ফ্লানাগান কেবলমাত্র !==চেকগুলির চেয়ে !=চেকগুলি পছন্দ করে । যতদূর আমি সচেতন সেখানে অন্য কোনও মূল্য নেই x != x। যারা পছন্দ করা: কিন্তু JavaScript বিকাশকারীদের দুটি ভিন্ন ধরনের গোষ্ঠীরনিউরোন হয় !=এবং যারা পছন্দ করা !==, গতি, স্বচ্ছতা, expressiveness, ইত্যাদি জন্য এটা হতে
স্টিভ Klosters

30
যখন কঠোর তুলনা একইভাবে আচরণ করে তখন আলগা তুলনা কেন ব্যবহার করবেন?
রাই-

3
@ রৌলুকো: NaNকোনও অনন্য ধরন নয়, এটি একটি সংখ্যা। এটি একটি অনন্য মূল্য যা নিজের সমান নয়।
টিজে ক্রাউডার

8
শিরোনামটি জনগণকে বিভ্রান্ত করছে বলে মনে হচ্ছে। আমি এটিকে "ইস x! = X এর চেয়ে x! == x এর মতো কিছুতে পরিবর্তিত করার পরামর্শ দেব?"
টিজে ক্রাউডার

6
@ ফেমমেস্টেম: জিওরজি বলেছেন "এই ক্ষেত্রে" এটি স্টাইলের বিষয়। এবং তিনি যে সঠিক। এটা তোলে নয় শৈলী যখন operands ধরনের ভিন্ন, কিন্তু এটা হয় যখন তারা একই শৈলী। পৃথকভাবে: ফ্যালানাগান এই তুলনাটি ===NaN এর সাথে না করে পয়েন্টটি তৈরি করতে NaN এর সাথে সমান নয় doing তিনি "ভুল" নন, তিনি এটি শিক্ষাদানের অনুশীলন হিসাবে করছেন, এটি প্রদর্শন করে যে এটি কার্যকর হয় না।
টিজে ক্রাউডার

উত্তর:


128

প্রথমত, আমি এটি উল্লেখ করতে পারি যে NaNএটি একটি খুব বিশেষ মান: সংজ্ঞা অনুসারে, এটি নিজের সমান নয়। এটি জাভাস্ক্রিপ্ট নম্বরগুলি আঁকানো আইইইই -754 স্ট্যান্ডার্ড থেকে আসে। "সংখ্যা নয়" মানটি কখনই নিজের সমান হয় না, এমনকি বিটগুলি হুবহু মিল থাকে। (যা তারা আইইইই--৫৪ এ অগত্যা নয়, এটি একাধিক পৃথক "একটি সংখ্যা নয়" মানগুলির জন্য মঞ্জুরি দেয়)) যার ফলে এটি এমনকি সামনে আসে; জাভাস্ক্রিপ্টে অন্যান্য সমস্ত মান তাদের সমান, NaNকেবল বিশেষ।

... আমি কি জাভাস্ক্রিপ্টের এমন কিছু মান মিস করছি যা এক্স! == x এর জন্য সত্য এবং x এর জন্য মিথ্যা! = x?

না তুমি নও. !==এবং এর মধ্যে পার্থক্যটি !=হ'ল অপারেটরগুলির ধরণগুলি একই হবার জন্য যদি প্রয়োজন হয় তবে পরবর্তীকর্মীরা প্রকারের ধরণের চাপ প্রয়োগ করবে। ইন x != x, অপারেন্ডগুলির ধরণগুলি একই রকম এবং তাই এটি ঠিক একইরকম x !== x

এটি অ্যাবস্ট্রাক্ট ইক্যুয়ালিটি অপারেশনের সংজ্ঞাটির শুরু থেকেই স্পষ্ট :

  1. ReturnIfAbrupt (x) এর।
  2. ReturnIfAbrupt (Y)।
  3. যদি টাইপ (এক্স) টাইপ (y) এর সমান হয়, তবে

    কঠোর সমতার তুলনা সম্পাদনের ফলাফলটি ফিরিয়ে দিন x === y।

  4. ...

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

সুতরাং যদি ফ্লানাগান সঠিক হয় যে এটি কেবল NaNসত্যই দেয় তবে x !== xআমরা নিশ্চিত হতে পারি যে এটি সত্য যে এটি কেবল NaNসত্যই দেবে x != x

ব্যবহার করার অনেক জাভাস্ক্রিপ্ট প্রোগ্রামারদের ডিফল্ট ===এবং !==জাভাস্ক্রিপ্টের এই মাতব্বরী আলগা অপারেটার না কাছাকাছি কিছু ফাঁদ এড়াতে, কিন্তু এই ক্ষেত্রে কঠোর বনাম আলগা অপারেটর Flanagan এর ব্যবহারের পড়তে কিছুই নেই।


আমার পুনরায় 4.9.1 - Equality and Inequality Operatorsবিভাগ রয়েছে এবং এটি উত্তর বলে মনে হচ্ছে। জন্য কী বিন্দু ===তুলনা হয়: If the two values have the same type, test them for strict equality as described above. If they are strictly equal, they are equal. If they are not strictly equal, they are not equal
জর্জি নেকেউরি

@ জিওরগি নানকুরি: আমি নিশ্চিত নই যে আপনি কী ৪.৯.১ উল্লেখ করছেন, সম্ভবত ফ্লানাগানের বই? তবে এটি মূলত উপরের অনুমান থেকে উদ্ধৃতিটি যা বলছে তা হ্যাঁ।
টিজে ক্রাউডার

2
আমি এটি গ্রহণ করছি কারণ এটি আমার প্রশ্নের উত্তর এবং যথাযথ ফ্যাশনে জবাব দেয়। ব্যাখ্যার জন্য আপনাকে ধন্যবাদ!
জর্জি নেকেউরি

1
@ মোশে: "লাইভ বাইন্ডিং" বলতে কী বোঝ? (শব্দটি চশমাটিতে উপস্থিত হয় না you ) আপনি কী GOTO 0 এর উদাহরণের মতো কিছু বলতে চান যেখানে aআসলে একটি ফাংশন এবং একই মানটি দুবার ফেরত দেয় না? এটি মান হিসাবে একই জিনিস নয় যার জন্য !==সত্য হবে, যা ওপি সম্পর্কে জিজ্ঞাসা করেছিল। এটি কেবল একটি ফাংশন যা বিভিন্ন মান দেয়। foo() !== foo()অপরিহার্যভাবে সত্য হয় না, যেহেতু fooপ্রতিটি কলটিতে বিভিন্ন মান ফিরে আসতে পারে।
টিজে ক্রাউডার

1
@ মোশে ওয়েল এটি সম্পত্তি এবং প্রাপ্তদের সাথে জড়িত করার একটি অতি-দুষ্টু উপায়। তবে এটি GOTO 0 এর উদাহরণের মতো দেখতে বেশ কিছুটা একইরকম প্রদর্শিত হবে, কেবলমাত্র একটি অতিরিক্ত গতিরোধের সাথে।
জ্যাব

37

NaN এর উদ্দেশ্যে !=এবং !==একই জিনিসটি করুন।

তবে, অনেক প্রোগ্রামার জাভাস্ক্রিপ্ট এড়ানো ==বা এড়ানো !=। উদাহরণস্বরূপ, ডগলাস ক্রকফোর্ড তাদের জাভাস্ক্রিপ্ট ভাষার " খারাপ অংশ " হিসাবে বিবেচনা করে কারণ তারা অপ্রত্যাশিত এবং বিভ্রান্তিমূলক আচরণ করে:

জাভাস্ক্রিপ্টে সমতা অপারেটরগুলির দুটি সেট রয়েছে: ===এবং !==, এবং তাদের দুষ্ট যুগল ==এবং !=। ভাল ব্যক্তিরা আপনার প্রত্যাশা অনুযায়ী কাজ করে।

... আমার পরামর্শটি হ'ল দুষ্ট যুগলকে কখনই ব্যবহার না করা। পরিবর্তে, সর্বদা ব্যবহার করুন ===এবং !==


2
প্রশ্নটি NaN সম্পর্কে নয় (শিরোনাম থাকা সত্ত্বেও)। প্রশ্নটি হ'ল "আমি জাভাস্ক্রিপ্টের এমন কিছু মান মিস করছি যা x! == x এর জন্য সত্য এবং x এর জন্য মিথ্যা! = X হবে?"
টিজে ক্রাউডার

@ টিজে ক্রাউডার দুটি প্রশ্ন, সত্যিই। প্রথম প্রশ্নটি "উভয় সংস্করণ ব্যবহার করা কি নিরাপদ" এবং উত্তরটি হ'ল উভয় সংস্করণ সমান। আমি আপনার "আন্ডার-দ্য হুড" উত্তরটি পছন্দ করি যা সমস্ত কিছু বিস্তারিতভাবে ব্যাখ্যা করে।
জে.কেদেব

22

কেবল মজাদার জন্য, আমি আপনাকে একটি কৃত্রিম উদাহরণ দেখাব যেখানে xএটি নয় NaNতবে অপারেটররা যাইহোক ভিন্ন আচরণ করে different প্রথম সংজ্ঞায়িত:

Object.defineProperty(
  self,
  'x',
  { get: function() { return self.y = self.y ? 0 : '0'; } }
);

তারপর আমাদের আছে

x != x // false

কিন্তু

x !== x // true

9
হা! :-) তবে এটি কার্যকরভাবে foo() != foo()যেখানে foo 1 পরে 2 প্রদান করে Eg উদাহরণস্বরূপ, মানগুলি একই হয় না, এটি কেবল বিভিন্ন মানের সাথে তুলনা করে।
টিজে ক্রাউডার

2

আমি কেবল NaNএটিই উল্লেখ করতে চাই যে x !== xবিশ্বব্যাপী অবজেক্টটি ব্যবহার না করেই কেবল উত্পন্ন হয় । এই আচরণটি ট্রিগার করার জন্য প্রচুর চালাক উপায় রয়েছে। এখানে একজন ব্যবহারকারী ব্যবহার করছে:

var i = 0, obj = { get x() { return i++; }};
with(obj) // force dynamic context, this is evil. 
console.log(x === x); // false

যেমন অন্যান্য উত্তরগুলি নির্দেশ করে, ==প্রকারের জোটবদ্ধতা সম্পাদন করে, তবে অন্যান্য ভাষাগুলির মতো এবং মানটির সমতুল্য - NaN একটি গণনা ব্যর্থতা নির্দেশ করে, এবং ভাল কারণে এটি নিজের সমান নয়।

কিছু কারণের কারণে লোকেরা এই সমস্যাটিকে জেএসের কাছে সমর্থন করে তবে বেশিরভাগ ভাষাগুলিতে দ্বিগুণ (যথা, সি, জাভা, সি ++, সি #, পাইথন এবং অন্যান্য) এই সঠিক আচরণটি প্রদর্শন করে এবং লোকেরা এটি ঠিকঠাক করে।


2
হ্যাঁ, জিটিও_0 এর উত্তরের মন্তব্যে @ টিজে ক্রাউডার ঠিক একই কথা বলেছেন, তাই না?
জর্জি নেকেউরি

আপনি কী এই অন্যান্য ভাষায় অস্পষ্ট ধরণের জবরদস্তি পেতে পারেন তা পরিষ্কার করতে পারেন?
চিকোকোভেনসিও

0

যেমন কখনও কখনও চিত্রগুলি শব্দের চেয়ে ভাল, এই টেবিলটি পরীক্ষা করুন (এটির পরিবর্তে একটি দৃশ্যমান হওয়ার কারণে এটি একটি মন্তব্য করার পরিবর্তে আমার উত্তর দেওয়ার কারণ)।

সেখানে আপনি দেখতে পাচ্ছেন যে কঠোর সমতার তুলনা (===) টাইপ এবং সামগ্রীর সাথে মেলে তবেই সত্য ফিরে আসে

var f = "-1" === -1; //false

বিমূর্ত সমতা তুলনা করার সময় (==) ধরণের রূপান্তর করে এবং তারপরে কঠোরভাবে তুলনা করে কেবলমাত্র * সামগ্রীটি পরীক্ষা করে:

var t = "-1" == -1; //true

যদিও এটি পরিষ্কার নয়, ইসিএমএর সাথে পরামর্শ না করে, জাভাস্ক্রিপ্টটি তুলনা করার সময় কী বিবেচনা করে, এমনভাবে কোড বেলো সত্যকে মূল্যায়ন করে।

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