কেন `নাল> = 0 && নাল <= 0` তবে` নাল == 0` নয়?


142

আমাকে একটি রুটিন লিখতে হয়েছিল যা ভেরিয়েবলের টাইপ হলে এর মান 1 বৃদ্ধি করে numberএবং 0 না করে ভেরিয়েবলের জন্য নির্ধারিত হয়, যেখানে ভেরিয়েবলটি প্রাথমিকভাবে হয় nullবা হয় undefined

প্রথম বাস্তবায়ন ছিল v >= 0 ? v += 1 : v = 0কারণ আমি ভেবেছিলাম যে কোনও কিছু নয় কিছু গণিতের প্রকাশকে মিথ্যা বানাবে, তবে এটি null >= 0সত্য ছিল যেহেতু সত্য হিসাবে মূল্যায়ন করা হয়। তারপরে আমি null0 টির মতো আচরণ শিখেছি এবং নিম্নলিখিত এক্সপ্রেশনগুলি সমস্ত সত্যকে মূল্যায়ন করা হয়।

  • null >= 0 && null <= 0
  • !(null < 0 || null > 0)
  • null + 1 === 1
  • 1 / null === Infinity
  • Math.pow(42, null) === 1

অবশ্যই, null0 নয় null == 0এটি মিথ্যা হিসাবে মূল্যায়ন করা হয়। এটি আপাতদৃষ্টিতে টোটোলজিক্যাল এক্সপ্রেশনটিকে (v >= 0 && v <= 0) === (v == 0)মিথ্যা করে তোলে ।

null0 এর মতো কেন , যদিও এটি আসলে 0 নয়?


3
তিনি জাভাস্ক্রিপ্ট নিয়ে কথা বলছেন। আপনার উদাহরণ পিএইচপি আছে। পিএইচপি অপারেটরে == একটি বিশেষ উপায়ে মানগুলির তুলনা করে। আপনি "10" == "1e1" (যা সত্য) এর মতো কিছু সত্যই ক্রেজি তুলনা করতে পারেন। আপনি যদি অপারেটর === ব্যবহার করেন তবে আপনি সম্পূর্ণ আলাদা ফলাফল পাবেন কারণ এটি পরীক্ষা করে টাইপটির সাথে মানটির সাথে মেলে কিনা। এই লিঙ্কটি দেখুন: php.net/manual/en/language.operators.compistance.php
পাইজুসন

পিএইচপি '==' অপারেটর সত্যই একটি "বিশেষ" উপায়ে কাজ করে।
টু-বিট অ্যালকেমিস্ট

আপনার প্রয়োজনীয়তা যদি 0 এর পরিবর্তে 1 এ গণনা শুরু করা হয় তবে প্রাথমিকভাবে হয় nullবা বর্ধিত কাউন্টারগুলির জন্য সত্যিই অতি ক্ষুদ্র উপায় রয়েছে undefined:c = -~c // Results in 1 for null/undefined; increments if already a number
এটস গোড়াল

1
undefinedএকটি চলক মান, ভেরিয়েবলের জন্য যা আরম্ভ করা হয়নি for nullঅন্যদিকে, এটি একটি খালি অবজেক্ট মান, এবং সংখ্যার সাথে মিশ্রিত করা উচিত নয়। nullসংখ্যার সাথে একত্রিত করা উচিত নয়, সুতরাং নালকে সংখ্যার মতো আচরণ করা উচিত নয়।
ম্যাথু

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

উত্তর:


207

আপনার আসল প্রশ্নটি মনে হচ্ছে:

কেন:

null >= 0; // true

কিন্তু:

null == 0; // false

আসলে যা ঘটে তা হ'ল গ্রেটার-থেকে-বা-সমান অপারেটর ( >=), ToPrimitiveএকটি ইঙ্গিত ধরণের সহ ধরণের জবরদস্তি ( ) সম্পাদন করে Number, আসলে সমস্ত সম্পর্কযুক্ত অপারেটরদের এই আচরণ থাকে।

nullইক্যুয়াল অপারেটর ( ==) দ্বারা একটি বিশেষ উপায়ে চিকিত্সা করা হয় । সংক্ষেপে, এটি কেবল এখানে জোর করে undefined:

null == null; // true
null == undefined; // true

মূল্য যেমন false, '', '0', এবং []সাংখ্যিক জাভাস্ক্রিপ্টের এই মাতব্বরী সাপেক্ষে, তাদের সব শুন্যতে নিগৃহীত হয়।

আপনি এই প্রক্রিয়াটির অভ্যন্তরীণ বিবরণটি অ্যাবস্ট্রাক্ট ইক্যুয়ালিটি তুলনা অ্যালগরিদম এবং অ্যাবস্ট্রাক্ট রিলেশনাল তুলনা অ্যালগরিদমে দেখতে পারেন

সংক্ষেপে:

  • রিলেশনাল তুলনা: উভয় মান স্ট্রিং না হলে উভয়কে ToNumberডাকা হয়। এটি +সামনে একটি যোগ করার মতো , যা নাল কোয়ার্সের জন্য 0

  • সমতার তুলনা: কেবল ToNumberস্ট্রিংস, নাম্বার এবং বুলিয়ানগুলিতে কল করে।


1
হাই সিএমএস, আপনার ব্যাখ্যা অনুসারে নাল আদিম 0, সুতরাং 0> = 0 সত্য ফিরে আসে এবং == মিথ্যা প্রত্যাবর্তন করে তবে একমা অ্যালগরিদম অনুসারে যদি টাইপ (এক্স) অবজেক্ট এবং টাইপ (y) হয় স্ট্রিং বা সংখ্যা, তুলনা ToPrimitive ফল আসতে (x) এর == এই y.then এটা true.please আমাকে ব্যাখ্যা ফেরত পাঠাবেন
bharath muppa

আমাকে উত্তর একটি উপলব্ধ করা হয় না উত্তর - null is treated in a special way by the Equals Operator (==). In a brief, it only coerces to undefined:- এবং কি? আপনি ব্যাখ্যা করতে পারেন, কেন null >= 0? :)
আন্দ্রে দেইনকো

@ ভরথমুপা @ অ্যান্ড্রে-ডাইনেকো: সিএমএসের বাকী উত্তর এখানে রয়েছে: অ্যাবস্ট্রাক্ট রিলেশনাল তুলনা অ্যালগরিদম যা পয়েন্ট ৩-এ ব্যাখ্যা করেছে যে উভয় মান যদি স্ট্রিং টাইপ না করে থাকে তবে উভয়কে টনবার বলা হয়। এটি +সামনে একটি যোগ করার মতো , যা নাল কোয়ার্সের জন্য 0। সাম্য কেবল স্ট্রিংস, নাম্বার এবং বুলিয়ানগুলিতে টনবারকে কল করে umber
মাইকেল লিকুরি

7
ভাল বর্ণনা, কিন্তু আমি এটি পছন্দ করি না। যে কোনও ভাষায় (x == 0 || x> 0) সমান (x> = 0) হওয়া উচিত। জাভাস্ক্রিপ্ট একটি বোকা ভাষা।
জন হেন্কেল

1
এটি আসলে অনুমানের মধ্যে একটি বাগ (কারণ গাণিতিকভাবে এটি ভুল) এবং লক্ষ লক্ষ ওয়েবসাইটগুলি নাল তুলনায়
ies

14

সমস্যার দৃশ্যমানতা আরও উন্নত করতে আমি প্রশ্নটি প্রসারিত করতে চাই:

null >= 0; //true
null <= 0; //true
null == 0; //false
null > 0;  //false
null < 0;  //false

এটা ঠিক কোন বুদ্ধি করে না। মানব ভাষার মতো এই জিনিসগুলিও হৃদয় দিয়ে শেখা দরকার।


1
উপরে বর্ণিত হিসাবে এটি কেবল একটি ব্যতিক্রম দিয়ে ব্যাখ্যা করা যেতে পারে যে কীভাবে == নাল আচরণ করে, অন্যথায় সমস্ত ক্ষেত্রে নালকে 0 (নাল) ব্যবহার করে 0 এ রূপান্তরিত করা হচ্ছে
সৌরভ

5

জাভাস্ক্রিপ্ট উভয় কঠোর এবং টাইপ – রূপান্তরকারী তুলনা

null >= 0;সত্য তবে (null==0)||(null>0)মিথ্যা

null <= 0;সত্য তবে (null==0)||(null<0)মিথ্যা

"" >= 0 সত্যও

রিলেশনাল অ্যাবস্ট্রাক্ট তুলনা (<=,> =) এর জন্য অপারেশনগুলি তুলনা করার আগে প্রথমে আদিমগুলিতে রূপান্তরিত করা হয়, তারপরে একই ধরণে।

typeof null returns "object"

যখন টাইপ করা হয় তখন জাভাস্ক্রিপ্ট অবজেক্টটিকে স্ট্রিংফাই করার চেষ্টা করে (অর্থাত নাল) নীচের পদক্ষেপগুলি নেওয়া হয় ( ইসিএমএসক্রিপ্ট 2015 ):

  1. যদি PreferredTypeপাস না hintকরা হয় তবে "ডিফল্ট" হতে দিন ।
  2. অন্যথায় যদি PreferredTypeহয় hintস্ট্রিং যাক hintহতে "STRING"।
  3. অন্যটি PreferredTypeহল hintনম্বর, আসুন hint"সংখ্যা"।
  4. যাক exoticToPrimহতে GetMethod(input, @@toPrimitive)
  5. ReturnIfAbrupt(exoticToPrim)
  6. যদি exoticToPrimঅপরিজ্ঞাত না হয়, তবে
    ক) ফলাফল আসুক Call(exoticToPrim, input, «hint»)
    খ) ReturnIfAbrupt(result)
    গ) যদি Type(result)অবজেক্ট না হয় তবে ফলাফলের ফলাফল।
    d) একটি টাইপরর ব্যতিক্রম নিক্ষেপ করুন।
  7. যদি hint"ডিফল্ট" হয় তবে hint"সংখ্যা" হতে দিন ।
  8. রিটার্ন OrdinaryToPrimitive(input,hint)

ইঙ্গিতটির জন্য অনুমোদিত মানগুলি হ'ল "ডিফল্ট", "সংখ্যা" এবং "স্ট্রিং"। তারিখ অবজেক্টস, বিল্ট-ইন ECMAScript অবজেক্টের মধ্যে স্বতন্ত্র যে তারা "ডিফল্ট" কে "স্ট্রিং" এর সমতুল্য বলে মনে করে। অন্যান্য সমস্ত অন্তর্নির্মিত ইসিএমএসস্ক্রিপ্ট অবজেক্টগুলি "ডিফল্ট" কে "সংখ্যার" সমতুল্য মনে করে । ( ECMAScript 20.3.4.45 )

সুতরাং আমি মনে করি null0 তে রূপান্তরিত হয়।


1

আমারও একই সমস্যা ছিল !!। বর্তমানে আমার একমাত্র সমাধানটি আলাদা করা to

var a = null;
var b = undefined;

if (a===0||a>0){ } //return false  !work!
if (b===0||b>0){ } //return false  !work!

//but 
if (a>=0){ } //return true !

এটা তোলে পরিষ্কার হতে পারে পরিবর্তে করতে: if (a!=null && a>=0)। এটি কেবল >=নিজের দ্বারা না করার কারণটি স্পষ্ট করে: "এটি নাল হতে পারে (বা অবধারিত, যা '== নাল' )ও হতে পারে"।
টুলমেকারস্টেভ

0
console.log( null > 0 );  // (1) false
console.log( null == 0 ); // (2) false
console.log( null >= 0 ); // (3) true

গাণিতিকভাবে, এটি অদ্ভুত। শেষ ফলাফলটি বলে যে "নাল শূন্যের চেয়ে বড় বা সমান", সুতরাং উপরের তুলনাগুলির মধ্যে এটি অবশ্যই সত্য হতে পারে, তবে তারা উভয়ই মিথ্যা।

কারণটি হ'ল একটি সাম্যতা চেক ==এবং তুলনাগুলি > < >= <=আলাদাভাবে কাজ করে। তুলনাগুলি নালকে একটি সংখ্যায় রূপান্তর করে, এটিকে হিসাবে বিবেচনা করে 0। এজন্য (3) null >= 0হ'ল trueএবং (1) null > 0হ'ল false

অন্যদিকে, সাম্যতা পরীক্ষা ==করে undefinedএবং nullএটি এমন সংজ্ঞায়িত করা হয় যে কোনও রূপান্তর ছাড়াই তারা একে অপরের সাথে সমান হয় এবং অন্য কিছুর সমান হয় না। এজন্য (2) null == 0হ'ল false

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