জাভাস্ক্রিপ্টে, কেন "0" মিথ্যা সমান, তবে 'যদি' পরীক্ষিত হয় তা নিজেই মিথ্যা হয় না কেন?


232

নিম্নলিখিত শোগুলি "0"জাভাস্ক্রিপ্টে মিথ্যা:

>>> "0" == false
true

>>> false == "0"
true

তাহলে নিচের মুদ্রণটি কেন "ha"?

>>> if ("0") console.log("ha")
ha

47
"0"এটি একটি স্ট্রিং, এবং যেহেতু এটি খালি নয়, এটি সত্য হিসাবে মূল্যায়ন করা হয়।
ডিজিটাল প্লেন

8
"0" === false [...] false

3
অ্যাঙ্গাস ক্রোলের নিবন্ধের সত্যটি জাভাস্ক্রিপ্টে দেখুন। javascriptweblog.wordpress.com/2011/02/07/…
টাইমারউড

8
'0'==falseতবে '0' কোনও মিথ্যা মান নয় (হ্যাঁ জাভাস্ক্রিপ্টটি অদ্ভুত হতে পারে)
লিন্সি

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

উত্তর:


251

কারণটি হ'ল কারণ যখন আপনি স্পষ্টভাবে করেন "0" == false, উভয় পক্ষই সংখ্যায় রূপান্তরিত হয় এবং তারপরে তুলনাটি সম্পাদন করা হয়।

আপনি যখন করবেন if ("0") console.log("ha"):, স্ট্রিংয়ের মান পরীক্ষা করা হচ্ছে। যে কোনও খালি খালি স্ট্রিংটি trueযখন একটি খালি স্ট্রিং হয় false

সমান (==)

দুটি অপারেন্ড যদি একই ধরণের না হয় , জাভাস্ক্রিপ্ট অপারেন্ডগুলিকে রূপান্তর করে তবে কঠোর তুলনা প্রয়োগ করে app অপরেন্দ্র যদি একটি সংখ্যা বা বুলিয়ান হয় তবে অপারেন্ডগুলি যদি সম্ভব হয় তবে সংখ্যায় রূপান্তরিত হয়; অন্যথায় যদি অপরেন্দ্র একটি স্ট্রিং হয় , অন্য অপারেন্ডটি যদি সম্ভব হয় তবে স্ট্রিংয়ে রূপান্তরিত হয়। যদি উভয় অপারেন্ডই বস্তু হয় তবে জাভাস্ক্রিপ্ট অভ্যন্তরীণ উল্লেখগুলি তুলনা করে যা সমান যখন অপারেশনগুলি মেমরিতে একই বস্তুকে উল্লেখ করে।

( মজিলা বিকাশকারী নেটওয়ার্কের তুলনা অপারেটরগুলি থেকে )


348

টেবিলগুলি ইস্যুটি প্রদর্শন করছে:

সত্য যদি বিবৃতি

এবং == জাভাস্ক্রিপ্টে সমস্ত অবজেক্টের ধরণের সত্যতা তুলনা

গল্পটি ব্যবহারের নৈতিকতা === কঠোর সাম্যতা বুদ্ধি প্রদর্শন

টেবিল প্রজন্মের ক্রেডিট: https://github.com/dorey/ জাভা স্ক্রিপ্ট- গুণমান- টেবিল



3
এখন থেকে যদি কেউ বলে যে সে কখনই কঠোর তুলনা অপারেটর ব্যবহার করে না, আমি এই টেবিলগুলির সাথে তার মুখোমুখি হব এবং তাকে কাঁদাব। এখনও আমি ধারণাটি উপলব্ধি কিনা তা নিশ্চিত না NaN। মানে, typeof NaN // numberতবে NaN === NaN // false, হুম ...
জাস্টাস রোমিজন

4
আমার এক বন্ধু f.cl.ly/items/3b0q1n0o1m142P1P340P/javascript_equality.html তৈরি করেছেন - উপরের মত একই গ্রাফগুলি, তবে পড়তে কিছুটা সহজ।
লুসি বাইন

@ জুস্টাসরোমিজনে উপস্থাপনের জন্য একাধিক মান রয়েছে NaN, সুতরাং আপনি যখন 2 জন এনএএন তুলনা করছেন তখন সেগুলি বিভিন্ন মানের হয় (আমার ধারণা)। এখানে প্রথম উদ্ধৃতি পড়ুন ।
সাইচোই

4
এই টেবিলগুলির একটি ভুল আছে। আমরাও ==না ===অপারেটর জন্য [], {}, [[]], [0]এবং [1]মান সত্য নির্ণয় করা হবে না। আমি বলতে চাইছি [] == []এবং [] === []মিথ্যাও।
হার্বার্টাস

38

এটা অনুমান অনুযায়ী।

12.5 যদি বিবৃতি 
.....

2. যদি টুবুলিয়ান (গেটভ্যালু (এক্সপ্রেফ)) সত্য হয়, তবে 
ক। প্রথম বিবৃতি মূল্যায়ন ফলাফল।
3. অন্য, 
....

ToBoolean, অনুমান অনুযায়ী, হয়

টবুলিয়ান বিমূর্ত অপারেশনটি তার যুক্তিটি সারণী 11 অনুযায়ী বুলিয়ান টাইপের একটি মানতে রূপান্তরিত করে:

এবং এই টেবিলটি স্ট্রিং সম্পর্কে এটি বলে:

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

ফলাফলটি মিথ্যা যদি যুক্তিটি খালি স্ট্রিং হয় (এর দৈর্ঘ্য শূন্য); অন্যথায় ফলাফল সত্য

এখন, কেন "0" == falseআপনাকে সমতা অপারেটরটি পড়তে হবে তা বোঝাতে, যা বলে যে এটি বিমূর্ত ক্রিয়াকলাপ থেকে এটির মান GetValue(lref)ডানদিকের সাথে একই মিলছে।

যা এই প্রাসঙ্গিক অংশটি বর্ণনা করে:

যদি IsPropertyReferences (V), তবে 
ক। যদি HasPrimitiveBase (V) মিথ্যা হয়, তবে আসুন বেস [অভ্যন্তরীণ] অভ্যন্তরীণ পদ্ধতি হোন, অন্যথায় আসুন
নীচে সংজ্ঞায়িত বিশেষ [[get]] অভ্যন্তরীণ পদ্ধতি হোন। 
খ। বেসটিকে এটির মান হিসাবে ব্যবহার করে অভ্যন্তরীণ পদ্ধতিটি কল করার ফলাফলটি পাস করুন
আর্গুমেন্টের জন্য getReferencesdName (V)

বা অন্য কথায়, একটি স্ট্রিংয়ের একটি আদিম বেস থাকে, যা অভ্যন্তরীণ পদ্ধতিটি আবার কল করে এবং মিথ্যা দেখায় শেষ হয়।

আপনি যদি getValue অপারেশন ব্যবহার করে জিনিসগুলি মূল্যায়ন করতে চান ==, আপনি যদি ব্যবহারটি মূল্যায়ন করতে চান তবে ToBooleanব্যবহার করুন ===("কঠোর" সমতা অপারেটর হিসাবেও পরিচিত)


"a string has a primitive base, which calls back the internal get method and ends up looking false"এটি কি সমস্ত স্ট্রিংয়ের জন্য সত্য?
আজিজ পুঞ্জানী 20

@ ইন্টারস্টেললার_ কোডার Section 8.12.3: [[Get]] (P)এটি কীভাবে কাজ করে তা বর্ণনা করে। স্ট্রিং 0 এর ক্ষেত্রে কেবল এটি সত্য, কারণ এটি অন্যান্য অভ্যন্তরীণ কলগুলির একগুচ্ছ পরিণতিতে ফলাফল হিসাবে GetOwnPropertyদেখা যায় যে "যাই হোক না কেন" একটি ডেটা সম্পত্তি, যা সেই মানটিকে সমস্ত উপায়ে ফেরত দেয়। এই কারণেই "0" মিথ্যা, এবং "বেলা" সত্য। ইয়াহু বিকাশকারী থিয়েটারে ডগলাস ক্রকফোর্ডের কয়েকটি ভিডিও দেখুন, তিনি আমার চেয়ে একটু কম জটিল জাভাস্ক্রিপ্টে "সত্যতা" বর্ণনা করেছেন। "সত্যবাদী" এবং "মিথ্যা" এর অর্থ যদি আপনি বুঝতে পারেন তবে আপনি এখনই ববিনসের উত্তরটি বুঝতে পারবেন।
ছদ্মবেশ

1
আমি কোথায় অনুমান পেতে পারি?
ব্যবহারকারী 985366

12

এটি পিএইচপি যেখানে স্ট্রিংটি "0"মিথ্যা (মিথ্যা-যখন-ব্যবহৃত-ইন-বুলিয়ান-প্রসঙ্গ)। জাভাস্ক্রিপ্টে, সমস্ত খালি খালি স্ট্রিং সত্যই।

কৌশলটি হ'ল যে ==কোনও বুলিয়ান বিপরীতে বুলিয়ান প্রসঙ্গে মূল্যায়ন করে না, এটি সংখ্যায় রূপান্তরিত হয় এবং দশমিক হিসাবে পার্স করে স্ট্রিংয়ের ক্ষেত্রে। সুতরাং আপনি 0সত্যতা বুলিয়ান পরিবর্তে নম্বর পাবেন true

এটি ভাষা ডিজাইনের সত্যই দুর্বল এবং দুর্ভাগ্যজনক ==অপারেটরটি ব্যবহার না করার চেষ্টা করার একটি কারণ এটি । ===পরিবর্তে ব্যবহার করুন।


7
// I usually do this:

x = "0" ;

if (!!+x) console.log('I am true');
else      console.log('I am false');

// Essentially converting string to integer and then boolean.

4

আপনার চারপাশের উদ্ধৃতিগুলি 0এটিকে একটি স্ট্রিং তৈরি করে, যা সত্য হিসাবে মূল্যায়ন করা হয়।

উদ্ধৃতিগুলি সরান এবং এটি কাজ করা উচিত।

if (0) console.log("ha") 

সঠিক, "এটি কীভাবে কাজ করবেন" সম্পর্কে নয় তবে প্রশ্নটি আরও বেশি, "এটি কেন এমন আচরণ করেছিল?"
অবিচ্ছিন্নতা

2

এটি সমস্তই ইসিএমএ স্পেসের "0" == falseকারণে ... এখানে নির্দিষ্ট বিধিগুলির কারণে http://ecma262-5.com/ELS5_HTML.htm#Sication_11.9.3 ... এবং if ('0')এখানে নির্দিষ্ট বিধিগুলির কারণে সত্যের কাছে মূল্যায়ন করা হয় http: / /ecma262-5.com/ELS5_HTML.htm#Section_12.5


আমি জানতাম না যে কেউ কোনও সাইটে স্পিকে পোর্ট করেছে ... এটি দুর্দান্ত! আমার জন্য আর পিডিএফ নেই।
ছদ্মবেশে

1

"যদি" এক্সপ্রেশনটি সত্যতার জন্য পরীক্ষা করে, তবে টাইপ-স্বতন্ত্র সমতুল্যের জন্য দ্বিগুণ-সমান পরীক্ষা করে। একটি স্ট্রিং সর্বদা সত্য, যেমন এখানে অন্যরা উল্লেখ করেছে। যদি ডাবল-ইক্যুয়াল সত্যবাদিতার জন্য এর উভয় ক্রিয়াকলাপটি পরীক্ষা করে ফলাফলগুলি তুলনা করে, তবে আপনি যে ফলাফলটি স্বজ্ঞাতভাবে অনুমান করছেন তা পেয়ে যাবেন, অর্থাৎ ("0" == true) === true। ডগ ক্রকফোর্ড যেমন তাঁর দুর্দান্ত জাভাস্ক্রিপ্টে বলেছেন : গুড পার্টস , "যে নিয়মগুলি [== এর অপারেশনগুলির প্রকারকে জোর করে]] তা জটিল এবং অবিস্মরণীয় .... ট্রানজিটিটির অভাব উদ্বেগজনক।" বলা বাহুল্য যে অপারেশনগুলির মধ্যে একটির সাথে অপরটির সাথে মিল রাখতে টাইপ-জোর করা হয় এবং "0" সংখ্যার শূন্য হিসাবে ব্যাখ্যা করা শেষ করে,


1

== সমতা অপারেটর যুক্তিগুলিকে সংখ্যায় রূপান্তর করার পরে তাদের মূল্যায়ন করে। সুতরাং স্ট্রিং শূন্য "0" নাম্বার ডাটা টাইপে রূপান্তরিত হয় এবং বুলিয়ান মিথ্যা 0 নম্বরে রূপান্তরিত হয়। সুতরাং

"0" == false // true

একই প্রযোজ্য `

false == "0" //true

=== কঠোর সাম্যতা চেক মূল তথ্য প্রকারের সাথে যুক্তিগুলি মূল্যায়ন করে

"0" === false // false, because "0" is a string and false is boolean

একই প্রযোজ্য

false === "0" // false

ভিতরে

if("0") console.log("ha");

স্ট্রিং "0" কোনও আর্গুমেন্টের সাথে তুলনা করছে না এবং স্ট্রিংটি একটি আসল মান যতক্ষণ না এটি আর্গুমেন্টের সাথে তুলনা করা হয়। এটা ঠিক মত

if(true) console.log("ha");

কিন্তু

if (0) console.log("ha"); // empty console line, because 0 is false

`


1

এর কারণ জাভাস্ক্রিপ্ট বুলিয়ান প্রসঙ্গ এবং আপনার কোডে ধরণের জবরদস্তি ব্যবহার করে

if ("0") 

বুলিয়ান প্রসঙ্গে সত্যে জোর করা হবে।

জাভাস্ক্রিপ্টে অন্যান্য সত্যবাদী মান রয়েছে যা বুলিয়ান প্রসঙ্গে যথাযথভাবে জোর করা হবে এবং এইভাবে যদি ব্লকটি কার্যকর করা হয়: -

if (true)
if ({})
if ([])
if (42)
if ("0")
if ("false")
if (new Date())
if (-42)
if (12n)
if (3.14)
if (-3.14)
if (Infinity)
if (-Infinity)

0
if (x) 

জাভা স্ক্রিপ্টের অভ্যন্তরীণ বুলিয়ান ব্যবহার করে এক্স কোরেসেস করুন (http://es5.github.com/#x9.2)

x == false

উভয় পক্ষকে অভ্যন্তরীণ নাম্বার জবরদস্তি (http://es5.github.com/#x9.3) ব্যবহার করে বা বস্তুর জন্য প্রিমিটিভ ব্যবহার করে (http://es5.github.com/#x9.1)

সম্পূর্ণ তথ্যের জন্য দেখুন http://javascriptweblog.wordpress.com/2011/02/07/truth-equality- এবং- javascript/

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