parseInt (নাল, 24) === 23… অপেক্ষা করুন, কী?


226

ঠিক আছে, তাই আমি পার্সে নিয়ে ঘোরাঘুরি করছিলাম এটি দেখার জন্য কীভাবে এটি মানগুলি এখনও শুরু হয় না এবং আমি এই রত্নকে হোঁচট খেয়েছি। 24 বা তদুর্ধের যে কোনও মূলকের জন্য নীচে ঘটে।

parseInt(null, 24) === 23 // evaluates to true

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

আমার মনে আছে ক্রোকফোর্ডের একটি বক্তৃতা শুনেছিলাম যেখানে তিনি বলছিলেন typeof null === "object"এমন একটি নজরদারি যার কারণে অবজেক্ট এবং নুলকে স্মৃতিতে কাছাকাছি অভিন্ন ধরণের শনাক্তকারী বা সেই লাইনের পাশাপাশি কিছু করতে পারে, কিন্তু আমি এখন ভিডিওটি পাই না।

এটি ব্যবহার করে দেখুন: http://jsfiddle.net/robert/txjwP/

সম্পাদনা সংশোধন: একটি উচ্চতর রেডিক্স বিভিন্ন ফলাফল দেয়, 32 প্রত্যাশা করে 785077
সম্পাদনা করুন 2 zzzzBov থেকে:[24...30]:23, 31:714695, 32:785077, 33:859935, 34:939407, 35:1023631, 36:1112745


TL; ড

parseInt(null, 24) === 23সত্য বক্তব্য কেন তা ব্যাখ্যা কর ।


49
কতটা কৌতুকময়। জাভাস্ক্রিপ্ট সর্বদা আপনাকে আপনার পায়ের আঙ্গুলের উপরে রাখে।
ফিশব্যাসকেট গর্ডো

1
ডেটা পয়েন্ট: alert(parseInt(null, 34) === 23)উত্পাদিতfalse
স্টিফেন পি

1
alert(parseInt(null,26)===23);এছাড়াও সত্য উত্পাদন করে?!?!
পেটার ইভানভ

6
[24...30]:23, 31:714695, 32:785077, 33:859935, 34:939407, 35:1023631, 36:1112745,[37...]:NaN
zzzzBov

1
অতিরিক্ত নোট undefinedহিসাবে, প্রথম প্যারামিটারটি 30 এর
দশকের

উত্তর:


240

এটি nullস্ট্রিংয়ে "null"রূপান্তর করছে এবং রূপান্তর করার চেষ্টা করছে। 0 থেকে 23 এর মূলের জন্য, কোনও রূপান্তর করতে পারে এমন কোনও সংখ্যা নেই, সুতরাং এটি ফিরে আসে NaN। 24 এ, "n"14 তম চিঠিটি সংখ্যা পদ্ধতিতে যুক্ত হয়। 31-এ, "u"21 তম চিঠিটি যুক্ত করা হয় এবং পুরো স্ট্রিংটি ডিকোড করা যায়। 37 এ আর কোনও বৈধ সংখ্যা সেট নেই যা উত্পন্ন হতে পারে এবং NaN ফিরিয়ে দেওয়া হবে।

js> parseInt(null, 36)
1112745

>>> reduce(lambda x, y: x * 36 + y, [(string.digits + string.lowercase).index(x) for x in 'null'])
1112745

3
@ তোমালাক: কে বলছে যে এটি ব্যবহার করছে toString()?
Ignacio Vazquez-Abram

3
@Ignacio। আসলে, আমি ভুল ছিল। আমি বুঝতে পারি নি 37 টি একটি রেডিক্সের কথা উল্লেখ করছে। এর জন্যে দুঃখিত.
মাইক স্যামুয়েল

3
@ রবার্ট, না আমি বিভ্রান্ত হয়ে পড়েছিলাম এবং ভেবেছিলাম তিনি যে দাবি করছেন তা বাদ দিয়ে অন্য কিছু দাবি করছেন। এটি সঠিক উত্তর। চারিদিকে ক্ষমা।
মাইক স্যামুয়েল

19
আমি এখনও মনে করি যে এই উত্তরটি কিছু রেফারেন্স সহ করতে পারে। যদিও এটি পুরোপুরি সঠিক, তবুও এটি সত্যিই একটি বড়
দৃ as়তা

4
@ তোমালাক - সমস্ত রেফারেন্সের জন্য আমার উত্তরটি পরীক্ষা করুন। এই উত্তরটি সঠিক (এবং প্রথম) এক তাই আমি মনে করি এটি গ্রহণযোগ্য উত্তর হিসাবে থাকা উচিত। যদিও এটি হুডের নীচে কী চলছে তা ব্যাখ্যা করতে কখনই ব্যথা দেয় না;)
ডেভিড টাইটারেন্সো

118

মজিলা আমাদের বলে :

ফাংশন পার্সেন্ট তার প্রথম যুক্তিকে একটি স্ট্রিংয়ে রূপান্তর করে , এটি পার্স করে এবং একটি পূর্ণসংখ্যা বা NaN প্রদান করে। না এনএন না হলে, প্রত্যাশিত মানটি নির্দিষ্ট মূল্যের (বেস) একটি সংখ্যা হিসাবে নেওয়া প্রথম যুক্তির দশমিক পূর্ণসংখ্যার প্রতিনিধিত্ব হবে। উদাহরণস্বরূপ, 10 এর একটি রেডিক্স দশমিক সংখ্যা, 8 টি অক্টাল, 16 হেক্সাডেসিমাল এবং আরও থেকে রূপান্তর করতে ইঙ্গিত দেয়। 10-র উপরে রেডিক্সের জন্য, বর্ণমালার বর্ণগুলি 9-র বেশি সংখ্যাকে নির্দেশ করে For উদাহরণস্বরূপ, হেক্সাডেসিমাল সংখ্যাগুলির জন্য (বেস 16), এফ মাধ্যমে F ব্যবহার করা হয়।

ইন বৈশিষ্ট , 15.1.2.2/1 আমাদেরকে বলে যে স্ট্রিং রূপান্তর ব্যবহার করে সঞ্চালিত হয় বিল্ট-ইন ToString, যা (যেমন প্রতি 9.8) উৎপাদনের "null"(সঙ্গে গুলিয়ে ফেলা যাবে না toString, যা উত্পাদ হবে "[object Window]"!)।

সুতরাং, আসুন বিবেচনা করা যাক parseInt("null", 24)

অবশ্যই, এটি সম্পূর্ণরূপে একটি বেস-24 সংখ্যার স্ট্রিং নয়, তবে "এন" হ'ল: এটি দশমিক 23

এখন, পার্সিং স্টপ পর দশমিক 23 টেনে বের করা হয়, কারণ "u" না হয় বেস-24 সিস্টেমের মধ্যে পাওয়া যায়নি:

যদি এস-তে এমন কোনও অক্ষর থাকে যা কোনও র‌্যাডিক্স-আর অঙ্ক নয়, তবে জেডকে এই জাতীয় অক্ষরের আগে সমস্ত অক্ষর সমন্বিত এস এর সাবস্ট্রিং হতে দিন; অন্যথায়, জেড এস হতে দিন [15.1.2.2/11]

(এবং এই কারণেই parseInt(null, 23)(এবং নিম্ন র‌্যাডিস) আপনাকে NaN২৩ এর পরিবর্তে দেয় : "n"বেস -৩৩ সিস্টেমে নেই))


2
এটি পার্সিয়ান্টের অত্যন্ত করুণ আচরণ (আমি ভাবছিলাম যে এই ক্ষেত্রে ব্যতিক্রম হলেও এটি কেন নকশা করা হয়নি)। আমি চাইলে এর পরিবর্তে NUMBER () ব্যবহার করতে পছন্দ করব।
গ্রিজেশ চৌহান

79

Ignacio Vazquez-Abram সঠিক, তবে এটি কীভাবে কাজ করে তা ঠিক দেখুন ...

থেকে 15.1.2.2 parseInt (string , radix):

যখন পার্সেন্ট ফাংশন বলা হয়, নিম্নলিখিত পদক্ষেপ নেওয়া হয়:

  • ইনপুটস্ট্রিং টুস্ট্রিং (স্ট্রিং) হতে দিন।
  • এস এর ইনপুটস্ট্রিংয়ের নতুন নির্মিত একটি স্ট্রিং হয়ে যাক প্রথম অক্ষর যা একটি স্ট্রাইটাইটস্পেসচার নয় এবং সমস্ত অক্ষর সেই অক্ষর অনুসরণ করে। (অন্য কথায়, শীর্ষস্থানীয় সাদা স্থান সরিয়ে দিন))
  • সাইন 1 হতে দিন।
  • যদি এস খালি না থাকে এবং এস এর প্রথম অক্ষরটি বিয়োগ চিহ্ন হয় - তবে সাইনটি −1 হতে দিন।
  • যদি এস খালি না থাকে এবং এস এর প্রথম অক্ষরটি একটি যোগ চিহ্ন + বা বিয়োগ চিহ্ন হয় - তবে এস থেকে প্রথম অক্ষরটি সরিয়ে ফেলুন S
  • চলুন আর = টু আইন্ট 32 (রডিক্স)।
  • স্ট্রিপপ্রফিক্স সত্য হতে দিন।
  • যদি আর ≠ 0 হয়, তবে ক। যদি আর <2 বা আর> 36 হয়, তবে NaN ফিরুন। খ। যদি আর ≠ 16 হয় তবে স্ট্রিপপ্রফিক্সটি মিথ্যা হোক।
  • অন্য, আর = 0 এ। আর = 10।
  • স্ট্রিপপ্রফিক্স যদি সত্য হয় তবে ক। যদি এস এর দৈর্ঘ্য কমপক্ষে 2 হয় এবং এস এর প্রথম দুটি অক্ষর হয় হয় "0x" বা "0 এক্স" হয়, তবে এস থেকে প্রথম দুটি অক্ষর সরান এবং আর = 16 দিন।
  • যদি এস-তে এমন কোনও অক্ষর থাকে যা কোনও র‌্যাডিক্স-আর অঙ্ক নয়, তবে জেডকে এই জাতীয় অক্ষরের আগে সমস্ত অক্ষর সমন্বিত এস এর সাবস্ট্রিং হতে দিন; অন্যথায়, জেড এস হতে দিন।
  • জেড খালি থাকলে, ফিরিয়ে দিন এনএএন।
  • গণিতকে গাণিতিক পূর্ণসংখ্যার মান হিসাবে ধরা যাক যাকে Z দ্বারা রেডিক্স-আর স্বরলিপিতে প্রতিনিধিত্ব করা হয়, 10 এবং 35 এর সাথে মানের সংখ্যার জন্য এজেড এবং অ্যাজ অক্ষর ব্যবহার করুন। (তবে, আর যদি 10 হয় এবং জেড 20 টিরও বেশি উল্লেখযোগ্য সংখ্যার সমন্বিত থাকে, প্রতিটি উল্লেখযোগ্য 20 এর পরে অঙ্কটি বাস্তবায়নের বিকল্পে 0 ডিজিটের দ্বারা প্রতিস্থাপিত হতে পারে এবং আর যদি 2, 4, 8, 10, 16, বা 32 না হয় তবে গণিতে এটি গাণিতিক পূর্ণসংখ্যার সাথে একটি বাস্তবায়ন-নির্ভর সংলগ্ন হতে পারে রেডিক্স-আর স্বরলিপিতে জেড দ্বারা প্রতিনিধিত্ব করা মান))
  • গণিতের জন্য নম্বরটি মান হওয়া যাক।
  • প্রতীক চিহ্ন × সংখ্যা।

দ্রষ্টব্য পার্সিয়ান্ট স্ট্রিংয়ের একটি শীর্ষস্থানীয় অংশটিকে পূর্ণসংখ্যার মান হিসাবে ব্যাখ্যা করতে পারে; এটি এমন কোনও চরিত্রকে অগ্রাহ্য করে যা কোনও পূর্ণসংখ্যার স্বরলিপি হিসাবে অংশ হিসাবে ব্যাখ্যা করা যায় না, এবং এমন কোনও অক্ষর উপেক্ষা করা হয়নি এমন কোনও ইঙ্গিত দেওয়া হয়নি।

এখানে দুটি গুরুত্বপূর্ণ অংশ রয়েছে। আমি দু'জনকেই সাহস করেছিলাম। সুতরাং সবার আগে, আমাদের toStringউপস্থাপনা কী তা খুঁজে বের করতে হবে null। আমরা তাকান প্রয়োজন Table 13 — ToString Conversionsযে তথ্যের জন্য বিভাগ 9.8.0 দেখুন:

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

দুর্দান্ত, সুতরাং এখন আমরা জানি যে toString(null)অভ্যন্তরীণভাবে করার ফলে একটি 'null'স্ট্রিং পাওয়া যায়। দুর্দান্ত, তবে প্রদত্ত র‌্যাডিক্সের মধ্যে বৈধ নয় এমন অঙ্কগুলি (অক্ষরগুলি) ঠিক কীভাবে এটি পরিচালনা করে?

আমরা উপরের দিকে তাকাই 15.1.2.2এবং আমরা নীচের মন্তব্যটি দেখতে পাই:

যদি এস-তে এমন কোনও অক্ষর থাকে যা কোনও র‌্যাডিক্স-আর অঙ্ক নয়, তবে জেডকে এই জাতীয় অক্ষরের আগে সমস্ত অক্ষর সমন্বিত এস এর সাবস্ট্রিং হতে দিন; অন্যথায়, জেড এস হতে দিন।

এর অর্থ হল যে আমরা সমস্ত অঙ্কগুলি PRIOR নির্দিষ্ট রেডিক্সের সাথে পরিচালনা করি এবং অন্য সমস্ত কিছু উপেক্ষা করি।

মূলত, করছেন parseInt(null, 23)একই জিনিস parseInt('null', 23)uকারণ দুই l's উপেক্ষিত করা (যদিও তারা র্যাডিক্স 23 অংশ)। সুতরাং, আমরা কেবলমাত্র বিশ্লেষণ করতে পারি n, পুরো বিবৃতিটিকে সমার্থক করে তুলি parseInt('n', 23)। :)

যেভাবেই হোক, দুর্দান্ত প্রশ্ন!


33
parseInt( null, 24 ) === 23

এর সমতুল্য

parseInt( String(null), 24 ) === 23

যা সমান

parseInt( "null", 24 ) === 23

২৪ বেসের অঙ্কগুলি 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, এ, বি, সি, ডি, ই, এফ, ..., এন are

ভাষা স্পেস বলে

  1. যদি এস-তে এমন কোনও অক্ষর থাকে যা কোনও র‌্যাডিক্স-আর অঙ্ক নয়, তবে জেডকে এই জাতীয় অক্ষরের আগে সমস্ত অক্ষর সমন্বিত এস এর সাবস্ট্রিং হতে দিন; অন্যথায়, জেড এস হতে দিন।

এটি এমন একটি অংশ যা নিশ্চিত করে যে সি-স্টাইলের পূর্ণসংখ্যার অক্ষরগুলি 15Lসঠিকভাবে পার্স করতে পছন্দ করে, তাই উপরেরটি সমতুল্য

parseInt( "n", 24 ) === 23

"n" উপরের অঙ্কের তালিকার 23-তম বর্ণ

Qed


16

আমার ধারণা nullএকটি স্ট্রিংয়ে রূপান্তরিত হয়েছে "null"। তাই nআসলে 23'base24' (এ 'base25 + একই) এ, uহয় অবৈধ এ' base24 'তাই স্ট্রিং বাকি nullউপেক্ষা করা হবে। কেন এটা আউটপুট যে 23পর্যন্ত u'base31' থেকে বৈধ হয়ে যাবে।


7

পার্সিয়ান্ট বর্ণানুক্রমিক উপস্থাপনা ব্যবহার করে, তবে বেস -৪৪ "এন" এর ক্ষেত্রে বৈধ, তবে "আপনি" অবৈধ অক্ষর, তারপরে পার্সইন্টটি কেবল "এন" মানটিকে পার্স করে ....

parseInt("n",24) -> 23

উদাহরণ হিসাবে, এটি দিয়ে চেষ্টা করুন:

alert(parseInt("3x", 24))

ফলাফল "3" হবে।

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