কেন নন (নাল) == জেএসে মিথ্যা?


129

জেএস-এর এই কোডটি আমাকে "আমার মনে হয় নাল একটি সংখ্যা" বলে একটি পপআপ দেয় যা আমি কিছুটা বিরক্তিকর মনে করি। আমি কী মিস করছি?

if (isNaN(null)) {
  alert("null is not a number");
} else {
  alert("i think null is a number");
}

আমি ফায়ারফক্স ৩ ব্যবহার করছি এটি কি ব্রাউজার বাগ?

অন্যান্য পরীক্ষা:

console.log(null == NaN);   // false
console.log(isNaN("text")); // true
console.log(NaN == "text"); // false

সুতরাং, সমস্যাটি NaN এর সাথে সঠিক তুলনা বলে মনে হচ্ছে না?

সম্পাদনা: এখন প্রশ্নের উত্তর দেওয়া হয়েছে, সংরক্ষণাগারটির জন্য আরও ভাল সংস্করণ রাখতে আমি আমার পোস্টটি পরিষ্কার করেছি। যাইহোক, এটি কিছু মন্তব্য এবং এমনকি কিছু উত্তরগুলি সামান্য বোধগম্য করে তোলে। তাদের লেখকদের দোষ দেবেন না। আমি যে জিনিসগুলিকে পরিবর্তন করেছি তা হ'ল:

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

3
আপনার অর্থ এই নয় যে "কেন ন্যান (নাল) == মিথ্যা"?
ম্যাট রোগিশ

আপনার কোডের ভিত্তিতে, ইসানান (নাল) মিথ্যা প্রত্যাবর্তন করছে (নাল "সংখ্যা নয়") যদি এটি বলে যে "আমার মনে হয় নাল একটি সংখ্যা"।
ডিভিনিমুর

উত্তর:


114

আমি বিশ্বাস করি কোডটি জিজ্ঞাসার চেষ্টা করছে, " xসাংখ্যিক?" নির্দিষ্ট ক্ষেত্রে এখানে x = null। ফাংশনটি isNaN()এই প্রশ্নের উত্তর দেওয়ার জন্য ব্যবহার করা যেতে পারে, তবে শব্দার্থগতভাবে এটি নির্দিষ্ট করে মানটির উল্লেখ করে NaN। উইকিপিডিয়া থেকে NaN:

NaN ( N ot a N uber) হ'ল সংখ্যাসূচক ডেটা টাইপের একটি মান যা একটি অপরিজ্ঞাত বা উপস্থাপনযোগ্য মানকে প্রতিনিধিত্ব করে, বিশেষত ভাসমান-পয়েন্ট গণনায়।

বেশিরভাগ ক্ষেত্রে আমরা "" নাল সংখ্যার উত্তর "বলে মনে করি? না হওয়া উচিত। তবে, isNaN(null) == falseশব্দার্থগতভাবে সঠিক, কারণ nullএটি নয় NaN

এখানে অ্যালগরিদমিক ব্যাখ্যা:

ফাংশনটি isNaN(x)উত্তীর্ণ প্যারামিটারটিকে 1 নম্বর (সমতুল্য Number(x)) এ রূপান্তর করার চেষ্টা করে এবং তারপরে মানটি পরীক্ষা করে NaN। যদি প্যারামিটারটি কোনও সংখ্যায় রূপান্তর করা যায় না, Number(x)তবে NaN2 ফিরে আসবে । সুতরাং, যদি প্যারামিটারের xসংখ্যায় রূপান্তর ঘটে তবে NaNএটি সত্য হয়; অন্যথায়, এটি মিথ্যা ফিরে।

সুতরাং নির্দিষ্ট ক্ষেত্রে x = null, null0 নম্বরে রূপান্তরিত হয়, (মূল্যায়নের চেষ্টা করুন Number(null)এবং দেখুন যে এটি 0, isNaN(0)ফিরে আসে ) এবং মিথ্যা প্রত্যাবর্তন করে। একটি স্ট্রিং যা কেবলমাত্র অঙ্কগুলিতে একটি সংখ্যায় রূপান্তরিত হতে পারে এবং isNaN মিথ্যাও দেয়। একটি স্ট্রিং (যেমন 'abcd') যে সংখ্যায় রূপান্তরিত করা যাবে না কারণ হবে isNaN('abcd')বিশেষভাবে কারণ, সত্য ফিরে যাওয়ার Number('abcd')আয় NaN

এই আপাত প্রান্তের কেসগুলি ছাড়াও 0/0 এর মতো এনএএন ফেরার মানক কারণগুলি।

প্রশ্ন দেখানো সমতার জন্য আপাতদৃষ্টিতে সঙ্গতিহীন পরীক্ষার জন্য হিসাবে, আচরণকে NaNযেমন উল্লেখ করা হয় যে, কোন তুলনা x == NaNমিথ্যা, অন্যান্য প্রতীক নির্বিশেষে সহ, NaNনিজেই 1


8
বিটিডাব্লু NaN !== NaN,। সুতরাং, আমি মনে করি, এটি বলা সম্পূর্ণভাবে সঠিক নয় Number('abcd') == NaNকারণ Number('abcd')এটি NaNসমান নয় NaN। আমি জাভাস্ক্রিপ্ট পছন্দ করি।
নীলফালস

হ্যাঁ. আমি বোঝাতে যে বোঝানো Number('abcd')হয় NaNকিন্তু আমি উহ্য এটি সমতার জন্য প্রকৃত পরীক্ষা, যে ক্ষেত্রে নয়। আমি এটি সম্পাদনা করব।
গ্লেন মোস

আমি অবাক হই কেন isNaNএবং কেন Numberসেভাবে আচরণের জন্য ডিজাইন করা হয়েছে?
টিমিডবয়

1
রূপান্তর nullকরার 0একমাত্র (এই প্রেক্ষাপটে অন্তত) মধ্যে ঘটে isNaN()ফাংশন, যা তার যুক্তি coerces।
গ্লেন মোস

3
সংখ্যা (নাল) == 0 তবে পার্সেন্ট (নাল) ==
নাএন জেএসকে

31

আমি নিজেই এই ইস্যুতে দৌড়েছি।

আমার জন্য, isnan ব্যবহারের সর্বোত্তম উপায়টি এর মতো

isNaN(parseInt(myInt))

উপর থেকে ফাইজমের উদাহরণ গ্রহণ করা,

var x = [undefined, NaN,     'blah', 0/0,  null, 0,     '0',   1,     1/0, -1/0,  Number(5)]
x.map( function(n){ return isNaN(parseInt(n))})
        [true,      true,    true,   true, true, false, false, false, true, true, false]

(আমি ফলাফলটি ইনপুট অনুসারে সারিবদ্ধ করেছি, আশা করি এটি পড়া সহজ হয়ে যায় easier)

এটি আমার কাছে আরও ভাল লাগছে।


1
myInt= "123 ডি" থাকলে কাজ করবে না । parseInt"123 ডি" কে 123 এ রূপান্তর করে যা isNaNপরীক্ষায় ব্যর্থ হয় ।
দিভেশ প্রিমদীপ

প্রকৃতপক্ষে, আপনি যদি সেই দৃশ্যটিও দেখতে চান তবে আমি আমার উত্তর এবং গ্লেনকে একত্রিত করার পরামর্শ দিই। যা দেখতে এই রকম হবে isNaN(parseInt(str,10)) || isNaN(Number())। বিটিডব্লিউ - আমার জন্য, যেহেতু parseIntস্ট্রিংয়ের সংখ্যাসূচক মানটি ব্যবহার করার জন্য আমাকে দৌড়াতে হবে , "123 ডি" কে বৈধ সংখ্যা হিসাবে গণ্য করা ঠিক হবে। তবে আমি সেই দৃশ্যটিও সনাক্ত করার প্রয়োজনীয়তাটি দেখতে পাচ্ছি।
লোক মোগ্রাবি

8

(আমার অন্য মন্তব্যটি একটি ব্যবহারিক পদ্ধতির গ্রহণ করে Here এখানে তাত্ত্বিক দিক রয়েছে))

আমি ইসিএমএ 262 স্ট্যান্ডার্ডটি সন্ধান করেছি , যা জাভাস্ক্রিপ্ট প্রয়োগ করে। ইসনানের জন্য তাদের স্পেসিফিকেশন:

ToNumber কে তার যুক্তিতে প্রয়োগ করে, তারপরে ফলাফলটি NaN হলে সত্যটি প্রত্যাবর্তন করে এবং অন্যথায় মিথ্যা ফিরিয়ে দেয়।

বিভাগ 9.3 এর আচরণ ToNumber(যা কলযোগ্য ফাংশন নয়, বরং ধরণের রূপান্তর সিস্টেমের একটি উপাদান) নির্দিষ্ট করে। সারণীর সংক্ষিপ্তসার হিসাবে, নির্দিষ্ট ইনপুট ধরণের একটি NaN উত্পাদন করতে পারে। এগুলি হ'ল টাইপ undefined, টাইপ number(কেবলমাত্র মান NaN), যে কোনও বস্তুর আদিম প্রতিনিধিত্ব NaN, এবং stringযাকে পার্স করা যায় না। এই পাতার undefined, NaN, new Number(NaN), এবং অধিকাংশ স্ট্রিং।

NaNপাস করার সময় আউটপুট হিসাবে উত্পন্ন এমন কোনও ইনপুট যখন খাওয়ানো হয় তখন ToNumberউত্পাদন trueকরে isNaN। যেহেতু nullসফলভাবে একটি সংখ্যায় রূপান্তর করা যায়, এটি উত্পাদন করে না true

এবং এটা কেন.


7

এটি আসলেই বিরক্তিকর। এখানে আমি পরীক্ষিত মানগুলির একটি অ্যারে দিচ্ছি:

var x = [undefined, NaN, 'blah', 0/0, null, 0, '0', 1, 1/0, -1/0, Number(5)]

এটি (ফায়ারব্যাগ কনসোলে) মূল্যায়ন করে:

,NaN,blah,NaN,,0,0,1,Infinity,-Infinity,5

আমি যখন কল করি x.map(isNaN)(প্রতিটি মানের জন্য আইএনএনএন কল করতে), আমি পাই:

true,true,true,true,false,false,false,false,false,false,false

উপসংহারে, isNaNদেখতে বেশ অকেজো! ( সম্পাদনা করুন : বাদে এটি isnaN কেবল সংখ্যার উপর দিয়ে সংজ্ঞায়িত করা হয়েছে, এক্ষেত্রে এটি ঠিক কাজ করে - কেবল একটি বিভ্রান্তকারী নাম দিয়ে with)

ঘটনাচক্রে, এখানে এই মানগুলির ধরণগুলি রয়েছে:

x.map(function(n){return typeof n})
-> undefined,number,string,number,object,number,string,number,number,number,number

আপনি কী ভাবেন যে এনএএন এর অর্থ হওয়া উচিত? আপনি কী মনে করেন যে এনএএন সম্পর্কে এত বিভ্রান্তিকর হয় বা এর পরীক্ষায়? আপনি কেন বিরক্ত?
বেকিম বাকাজ

ঠিক আছে, এটি 8 বছর আগে ছিল, তবে দেখে মনে হচ্ছে যে আমি বিরক্ত হয়েছি 1) এটির মানগুলির ক্ষেত্রে অসামঞ্জস্যপূর্ণ ফলাফল রয়েছে যা সংখ্যার ধরণের নয় এবং 2) এটি এমন কোনও ক্ষেত্রে সত্য প্রত্যাবর্তন করে যা সংখ্যার ধরণের নয়। কারণ একটি স্ট্রিং প্রকৃতপক্ষে একটি এনএন নয়। (এছাড়াও আমার অন্যান্য উত্তরটি দেখুন, যা এটি কেন ঘটে তা ব্যাখ্যা করে))
আপনার মোডের সাথে ভাল আচরণ করুন

5

নাল NaN নয়, পাশাপাশি একটি স্ট্রিং NaN নয়। isNaN () আপনার যদি সত্যিই NaN অবজেক্ট থাকে তবে কেবল পরীক্ষা করুন।


তবে এরপরে কমপক্ষে একটি স্ট্রিং একটি NaN অবজেক্টে কাস্ট করা হবে, যেমন isNaN ("পাঠ্য") সত্য দেয় returns
হ্যানো ফিয়েটজ

1

আমি যখন জেএসে আসি তখন আমি ঠিক নিশ্চিত নই তবে আমি অন্যান্য ভাষায়ও একই জিনিস দেখেছি এবং এটি সাধারণত কারণ ফাংশনটি কেবল নালটি NaN এর ঠিক সমান কিনা তা খতিয়ে দেখছে (যেমন নাল === NaN মিথ্যা হবে)। অন্য কথায় এটি এমন নয় যে এটি মনে করে যে নালটি আসলে একটি সংখ্যা, তবে এটি নাল নয়এন নয় rather এটি সম্ভবত কারণ উভয়ই জেএসে পৃথকভাবে উপস্থাপিত হয়েছে যাতে তারা ঠিক 9: == '9' তে একইভাবে হবে না।


1

ES5 এ, এটি isNaN (number)আর্গুমেন্ট NaN তে জোর করে যদি সত্য হিসাবে প্রত্যাশিত হিসাবে সংজ্ঞায়িত হয় এবং অন্যথায় মিথ্যা প্রত্যাবর্তন করে।

এবং বিমূর্ত ক্রিয়াকলাপটি ToNumber রূপান্তর টেবিলটি দেখুন । সুতরাং এটি অভ্যন্তরীণভাবে JS ইঞ্জিন নিরীক্ষাগুলো যাচাই ToNumber(Null)হয় +0, তারপর অবশেষে isNaN(null)হয়false


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