কেন "সত্য" == সত্য জাভাস্ক্রিপ্টে মিথ্যা দেখাচ্ছে?


89

MDC ==অপারেটরটিকে নিম্নরূপ বর্ণনা করে :

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

এটি মাথায় রেখে, আমি "true" == trueনিম্নলিখিত হিসাবে মূল্যায়ন করব :

  1. তারা কি একই ধরণের? না
  2. হয় হয় কোন সংখ্যা বা বুলিয়ান অপারেন্ড করা হয়? হ্যাঁ
  3. আমরা উভয়কে একটি সংখ্যায় রূপান্তর করতে পারি? না ( isNaN(Number("true")) // true)
  4. হয় একটি স্ট্রিং অপরেন্ড হয়? হ্যাঁ
  5. আমরা কি অন্য অপারেন্ডকে স্ট্রিংয়ে রূপান্তর করতে পারি? হ্যাঁ ( String(true) === "true" // true)

আমি স্ট্রিংগুলি দিয়ে শেষ করেছি "true"এবং "true"যার মূল্যায়ন করা উচিত trueতবে জাভাস্ক্রিপ্টটি মিথ্যা দেখাচ্ছে।

আমি কি মিস করেছি?


প্রাসঙ্গিক: es5.github.com/#x11.9.1
zzzzBov

6
চারপাশে অনেক জাভাস্ক্রিপ্ট নিয়ে, if("true" == true) {console.log("yes")} else {console.log("no")}; if("true") {console.log("yes")} else {console.log("no")}
বিশ্বটি

4
আমি বলতে চাই, আমি উন্নত, এবং এটি খুব বোকা যে এটি ঘটে। সর্বদা সর্বদা সর্বদা ব্যবহারের আরেকটি কারণ ===
বিটি

@ ব্যবহারকারী 1068352 বিশৃঙ্খলা পরীক্ষা করুন :) dorey.github.io/ জাভা স্ক্রিপ্ট- যোগ্যতা- টেবিল
পিমেন্টেল

উত্তর:


89

কারণ "true"রূপান্তরিত হয় NaN, যখন trueরূপান্তরিত হয় 1। সুতরাং তারা পৃথক।

আপনার প্রতিবেদনের মতো, উভয়ই সংখ্যায় রূপান্তরিত হয়েছে, কারণ কমপক্ষে trueহতে পারে (এরিক রেপেনের মন্তব্য দেখুন) এবং তারপরে তুলনা করা যেতে পারে।


আপনি আমাকে বলতে পারেন যে পদক্ষেপটি কখন Can we convert both to a number?মিথ্যা হবে? এমনকি NaNযদি একটি সংখ্যা হয় তবে কীভাবে এই পদক্ষেপটি ব্যর্থ হতে পারে?
আইজাক

4
হয় বনাম না। যদি উভয়ই NaN এর ফলাফল দেয় তবে তারা স্ট্রিং মূল্যায়নে স্যুইচ করবে। যদি কেবল একজনকে রূপান্তর করা যায় তবে এখনও একটি সংখ্যা তুলনা রয়েছে।
এরিক রেপেন

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

আপনি নিজেই রূপান্তরগুলি দেখতে পাচ্ছেন Number(true)এবংNumber('true')
এরিক রেপেন

11

==তুলনা অপারেটর হয় ECMA 5 সংজ্ঞায়িত হিসাবে:

  1. তাহলে প্রকার (x) এর সংখ্যা এবং প্রকার (Y) স্ট্রিং হয়,
    তুলনা এক্স == ফল আসতে ToNumber (Y)।
  2. যদি টাইপ (x) স্ট্রিং হয় এবং প্রকার (y) হয় নম্বর
    হয় তবে তুলনাটির ফলাফলটি ToNumber (x) == y প্রদান করুন।
  3. যদি টাইপ (এক্স) বুলিয়ান হয় তবে টুনবার (x) == y এর তুলনার ফলাফলটি ফিরিয়ে দিন
  4. যদি প্রকার (y) বুলিয়ান হয় তবে তুলনাটির ফলাফলটি x == টনবার (y) প্রদান করুন।

সুতরাং, "সত্য" == সত্যকে মূল্যায়ন করা হয়:

  1. "সত্য" == টু নাম্বার (সত্য)   (নিয়ম 7 এর মাধ্যমে)
  2. "সত্য" == 1
  3. টনবার ("সত্য") == 1   (নিয়ম 5 এর মাধ্যমে)
  4. নাএন == ১

===> মিথ্যা


3

বিমূর্ত সমতা তুলনা অ্যালগরিদমের সাথে মিলিত হচ্ছে

http://www.ecma-international.org/ecma-262/5.1/#sec-11.9.3

যদি ওপেনার্ডগুলির মধ্যে একটি বুলিয়ান হয় এবং অন্যটি না হয়, বুলিয়ান 0 বা 1 তে রূপান্তরকারী হয় তাই true == "true"এটি মিথ্যা।


আমি কি নিম্নলিখিত উপায়ে সঠিকভাবে অনুমান করেছি? "সত্য" == সত্য "সত্য" == 1 হয়ে যায় এবং তারপরে "সত্য" == "1" হয়ে যায় এজন্য তারা মিথ্যা ফিরে আসে?
ভুকানঘোয়াং
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.