স্ট্রিংগুলিকে সংখ্যায় রূপান্তর করার সময় কীভাবে parseInt()
এবং Number()
অন্যরকম আচরণ করে?
স্ট্রিংগুলিকে সংখ্যায় রূপান্তর করার সময় কীভাবে parseInt()
এবং Number()
অন্যরকম আচরণ করে?
উত্তর:
ওয়েল, তারা শব্দার্থগতভাবে বিভিন্ন , Number
কন্সট্রাকটর একটি ফাংশন হিসাবে বলা সঞ্চালিত টাইপ রূপান্তর এবং parseInt
সঞ্চালিত পার্স , যেমন:
// parsing:
parseInt("20px"); // 20
parseInt("10100", 2); // 20
parseInt("2e1"); // 2
// type conversion
Number("20px"); // NaN
Number("2e1"); // 20, exponential notation
মনে রাখবেন যে যদি parseInt
স্ট্রিংয়ে একটি শীর্ষস্থানীয় শূন্য সনাক্ত করে, এটি অষ্টাল বেসে সংখ্যাটি বিশ্লেষণ করবে, এটি স্ট্যান্ডার্ডের নতুন সংস্করণ ইসমাস্ক্রিপ্ট 5 এ পরিবর্তিত হয়েছে, তবে ব্রাউজার বাস্তবায়নে এটি দীর্ঘ সময় নিতে হবে (এটি এটি ECMAScript 3) এর সাথে একটি বেমানানতা, parseInt
চলিত অক্ষরগুলিকে উপেক্ষা করবে যা বর্তমানে ব্যবহৃত বেসের কোনও অঙ্কের সাথে মিলে না।
Number
কন্সট্রাকটর octals শনাক্ত করতে পারছে না:
Number("010"); // 10
parseInt("010"); // 8, implicit octal
parseInt("010", 10); // 10, decimal radix used
তবে এটি হেক্সাডেসিমাল স্বরলিপিতে সংখ্যাগুলি পরিচালনা করতে পারে, ঠিক যেমন parseInt
:
Number("0xF"); // 15
parseInt("0xF"); //15
এছাড়াও, সংখ্যার ধরণের রূপান্তর সম্পাদনের জন্য বহুল ব্যবহৃত কন্সট্রাক্ট হ'ল ইউনারি +
অপারেটর (পি। 72২) , এটি Number
কনস্ট্রাক্টরকে একটি ফাংশন হিসাবে ব্যবহার করার সমতুল্য :
+"2e1"; // 20
+"0xF"; // 15
+"010"; // 10
Number()
হেক্স এবং বাইনারিগুলির মতো অষ্টালগুলি মোকাবেলা করে:Number('0o10') == 8
typeof parseInt("123") => number
typeof Number("123") => number
typeof new Number("123") => object (Number primitive wrapper object)
প্রথম দুটি আপনাকে আরও ভাল পারফরম্যান্স দেবে কারণ এটি কোনও বস্তুর পরিবর্তে কোনও আদিম প্রত্যাবর্তন করে।
new Number()
থেকে আলাদা Number()
। typeof Number("123") => number
new Number("1") != new Number("1")
। কখনও ব্যবহার করুনnew Number
। কখনও কখনও কখনও না। Number("1")
অন্যদিকে, পুরোপুরি যুক্তিসঙ্গত।
let x = new Number("2"); let y = new Number("2");
এবং তারপরে পরে যেকোন কারণে if (x == y) { doSomething(); }
যৌক্তিকতার doSomething
জন্য ডাকা উচিত equality কিন্তু এটা অভয়। এছাড়াও যদি আপনি কেবল একটি সংখ্যা বিশ্লেষণ করতে চান let x = new Number("2");
তবে x === 2
এটি মিথ্যা হবে be এটি আপনার স্পষ্ট কারণ নয় কেনnew Number
আপনি যদি পারফরম্যান্সের সন্ধান করছেন তবে সম্ভবত সেরা ফলাফলগুলি আপনি বিটওয়াইস ডান শিফট সহ পাবেন "10">>0
। এছাড়াও ( "10" * 1
) বা গুণিত ( ) না ~~"10"
। তাদের সমস্ত অনেক দ্রুত Number
এবং parseInt
। এমনকি সংখ্যার যুক্তি নয় বলে তাদের "বৈশিষ্ট্য" 0 ফেরত রয়েছে। এখানে পারফরম্যান্স পরীক্ষা রয়েছে ।
Number
এবং parseInt
এখনও বাকিগুলির চেয়ে 99% ধীর। আমার সাথে তারা ভিজ্যুয়ালি খুব কম আকর্ষণীয় :-)
parseInt
বা Number
বেশি পছন্দসই। আপনি যদি প্রতি সেকেন্ডে কয়েক মিলিয়ন রূপান্তর নিয়ে একটি N64 এমুলেটর প্রোগ্রামিং করে থাকেন তবে আপনি সেই কৌশলগুলি বিবেচনা করতে পারেন।
(2**31).toString() >> 0
উপচে পড়া হবে -2147483648
। আপনি জাভাস্ক্রিপ্ট অপারেন্ডকে একটি স্বাক্ষরবিহীন 32-বিট পূর্ণসংখ্যার হিসাবে ব্যবহার করার >>>
পরিবর্তে ব্যবহার করতে পারেন তবে তার চেয়ে বড় কোনও সংখ্যাও উপচে পড়বে। >>
2**32 - 1
রূপান্তরিত string
করার বিভিন্ন উপায়ের মধ্যে আমি পারফরম্যান্সের দুটি লিঙ্কের তুলনা করেছি int
।
parseInt(str,10)
parseFloat(str)
str << 0
+str
str*1
str-0
Number(str)
parseInt()
:
NaN
তবে ফিরে আসবে।parseInt()
ফাংশনটি একটি সংখ্যাসূচক মানের মুখোমুখি হয় তবে এটি বাকী ইনপুট স্ট্রিংটি কেটে ফেলবে এবং অ সংখ্যাগত মান না হওয়া পর্যন্ত কেবল অংশটি পার্স করবে।undefined
0 বা হয়, জেএস নিম্নলিখিতগুলি ধরে নেবে:
ES5
10 ব্যবহার করা উচিত তা নির্দিষ্ট করে। তবে এটি সমস্ত ব্রাউজার দ্বারা সমর্থিত নয়, সুতরাং আপনার সংখ্যাটি 0 দিয়ে শুরু করতে পারলে সর্বদা রেডিক্স নির্দিষ্ট করুন।Number()
:
Number()
কন্সট্রাকটর একটি সংখ্যা মধ্যে কোনো আর্গুমেন্ট ইনপুট রূপান্তর করতে পারেন। যদি Number()
কনস্ট্রাক্টর ইনপুটটিকে কোনও সংখ্যায় রূপান্তর করতে না পারে,NaN
পারে তবে ফিরে আসবে।Number()
কন্সট্রাকটর এছাড়াও হেক্সাডেসিমেল সংখ্যাকে সব ব্যবস্থা করতে সক্ষম, তারা দিয়ে শুরু করতে হবে 0x
।console.log(parseInt('0xF', 16)); // 15
// z is no number, it will only evaluate 0xF, therefore 15 is logged
console.log(parseInt('0xFz123', 16));
// because the radix is 10, A is considered a letter not a number (like in Hexadecimal)
// Therefore, A will be cut off the string and 10 is logged
console.log(parseInt('10A', 10)); // 10
// first character isnot a number, therefore parseInt will return NaN
console.log(parseInt('a1213', 10));
console.log('\n');
// start with 0X, therefore Number will interpret it as a hexadecimal value
console.log(Number('0x11'));
// Cannot be converted to a number, NaN will be returned, notice that
// the number constructor will not cut off a non number part like parseInt does
console.log(Number('123A'));
// scientific notation is allowed
console.log(Number('152e-1')); // 15.21
আমি সর্বদা পার্সিয়ান্ট ব্যবহার করি তবে শীর্ষস্থানীয় শূন্যগুলি থেকে সাবধান থাকুন যা এটি অষ্টাল মোডে বাধ্য করবে ।
parseInt(value, radix)
যে দুর্ঘটনাজনিত অক্টাল মোড রূপান্তর ইত্যাদির মতো আপনার কাছে এমনভাবে কোনও রেডিক্স সরবরাহ করা সর্বদা একটি ভাল ধারণা
0
, এমনকি অ কঠোর মোডে। তবে এটি স্থির করা হয়েছে এবং এখন নেতৃস্থানীয় শূন্যগুলি কেবল উপেক্ষা করা হবে, তাই parseInt("070")
হয়ে যাবে 70
।
parseInt()
।
parseInt()
-> নির্দিষ্ট রেডিক্সে একটি সংখ্যা পার্স করে।
Number()
-> যদি এটি ব্যর্থ হয় তবে নির্দিষ্ট মানটিকে তার সংখ্যাসূচক বা NaN এ রূপান্তর করে।
সুতরাং কিছু সংখ্যক মানকে সংখ্যায় রূপান্তর করার জন্য আমাদের সর্বদা সংখ্যা () ফাংশন ব্যবহার করা উচিত।
যেমন।
Number("")//0
parseInt("")//NaN
Number("123")//123
parseInt("123")//123
Number("123ac") //NaN,as it is a non numeric string
parsInt("123ac") //123,it parse decimal number outof string
Number(true)//1
parseInt(true) //NaN
parseInt()
ফাংশনগুলিতে বিভিন্ন কর্নার কেস রয়েছে যেমন এটি রূপান্তরকে পুনর্নির্মাণ করে, তাই আমাদের জড়িত উদ্দেশ্যে পার্সেন্ট () ফাংশনটি ব্যবহার করা উচিত।
এখন, আবহাওয়া যাচাই করতে প্রদত্ত মানটি হ'ল সংখ্যা বা না, আমাদের দেশীয় isNaN()
ফাংশনটি ব্যবহার করা উচিত
parseInt একটি পূর্ণসংখ্যার সংখ্যায় রূপান্তর করে, এটি দশমিককে পৃথক করে। সংখ্যা পূর্ণসংখ্যায় রূপান্তর করে না।
পার্সেন্ট থেকে দূরে থাকুন এবং আপনার হেক্স বা অষ্টাল না লাগলে নম্বর এবং ম্যাথ.াউন্ড ব্যবহার করা ভাল ধারণা। উভয়ই স্ট্রিং ব্যবহার করতে পারে। কেন এ থেকে দূরে থাকবেন?
parseInt(0.001, 10)
0
parseInt(-0.0000000001, 10)
-1
parseInt(0.0000000001, 10)
1
parseInt(4000000000000000000000, 10)
4
এটি সম্পূর্ণ কসাই সত্যই বড় বা সত্যই ছোট সংখ্যায়। অদ্ভুতভাবে যথেষ্টভাবে এটি কার্যকরভাবে কাজ করে যদি এই ইনপুটগুলি স্ট্রিং হয়।
parseInt("-0.0000000001", 10)
0
parseInt("0.0000000001", 10)
0
parseInt("4000000000000000000000", 10)
4e+21
এটির সাথে উল্লিখিত অন্যান্য গোটাচাস লোকদের সাথে বাগগুলি খুঁজে পেতে কঠোর ঝুঁকির পরিবর্তে আমি কেবলমাত্র পার্সইনটি এড়িয়ে যাব যদি না আপনি দশটি বেস 10 ব্যতীত অন্য কিছু পার্স করার প্রয়োজন না হয় তবে সংখ্যা, ম্যাথ.উইন্ড, ম্যাথ.ফুর, এবং .ফিক্সড (0) সবকটি পারে একই ধরণের জিনিসগুলি করুন যেমন এই ধরণের বাগগুলি ছাড়াই পার্সেন্ট ব্যবহার করা যেতে পারে।
আপনি যদি এর অন্যান্য গুণাবলীর জন্য যদি সত্যিই পার্সইন্ট ব্যবহার করতে চান বা প্রয়োজন হয় তবে এটি কখনও ফ্লোটকে ইনসে রূপান্তর করতে ব্যবহার করবেন না।