পার্সেন্ট () এবং সংখ্যা () এর মধ্যে পার্থক্য কী?


উত্তর:


457

ওয়েল, তারা শব্দার্থগতভাবে বিভিন্ন , 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

মজাদার, পার্সআইটেন সংখ্যাটি অনুসরণ করা কোনও অক্ষরকে উপেক্ষা করে? কারণ আমার ক্ষেত্রে আমি রূপান্তর করার সময় ২০ এর পরিবর্তে একটি এনএএন পেতে পছন্দ করব।
চিহ্নিত করুন

হ্যাঁ এটা করে. আপনার মতো মনে হচ্ছে অবশ্যই নাম্বার চান ()
গ্যারেথ

ঠিক আছে, সুতরাং আমি অনুমান করি যে আমি সংখ্যাটি নিয়ে যাব () তবে এই পয়েন্টটি পরিষ্কার করার জন্য এবং এই সমস্ত উদাহরণগুলিকে অনেক ধন্যবাদ! :-)
চিহ্নিত করুন

1
এই জন্য আপনাকে ধন্যবাদ. এই প্রথম আমি এনএএন-কে দেখেছি। কিছু লোকের পক্ষে এটি জেনে রাখা সহায়ক হতে পারে যে NaN ফাংশন isNaN (মান) দিয়ে পরীক্ষা করা হয়। উদাহরণস্বরূপ, কেবল "if (মান == NaN)" ব্যবহার করা কার্যকর হবে না।
ওয়ান্ডারফুলডে

1
Number()হেক্স এবং বাইনারিগুলির মতো অষ্টালগুলি মোকাবেলা করে:Number('0o10') == 8
জুয়ান মেন্ডেস

22
typeof parseInt("123") => number
typeof Number("123") => number
typeof new Number("123") => object (Number primitive wrapper object)

প্রথম দুটি আপনাকে আরও ভাল পারফরম্যান্স দেবে কারণ এটি কোনও বস্তুর পরিবর্তে কোনও আদিম প্রত্যাবর্তন করে।


20
new Number()থেকে আলাদা Number()typeof Number("123") => number
গ্যারেথ

8
এছাড়াও new Number("1") != new Number("1")কখনও ব্যবহার করুনnew Number । কখনও কখনও কখনও না। Number("1")অন্যদিকে, পুরোপুরি যুক্তিসঙ্গত।
ক্রেজেন জাভিয়ার সিটেকার

18
@ ক্র্যাজেন, সম্প্রদায়ের পক্ষে এটি আরও বেশি উপকারী হবে যদি আপনি ব্যাখ্যা করেন যে আপনার "নতুন সংখ্যা" ব্যবহার করা উচিত নয় - কেবল "5 বার" টাইপ না করে ...
কেন

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
টম সি

1
@ টমসি আপনি একটি সম্পাদিত মন্তব্যের ফলাফল দেখতে পাচ্ছেন (মন্তব্যটি নীচের পেনসিল আইকনটিকে অনুসরণ করে); আগে শূন্য ব্যাখ্যা ছিল, কেবল দৃ strong় উপদেশ ad
কেন

15

আপনি যদি পারফরম্যান্সের সন্ধান করছেন তবে সম্ভবত সেরা ফলাফলগুলি আপনি বিটওয়াইস ডান শিফট সহ পাবেন "10">>0। এছাড়াও ( "10" * 1) বা গুণিত ( ) না ~~"10"। তাদের সমস্ত অনেক দ্রুত Numberএবং parseInt। এমনকি সংখ্যার যুক্তি নয় বলে তাদের "বৈশিষ্ট্য" 0 ফেরত রয়েছে। এখানে পারফরম্যান্স পরীক্ষা রয়েছে


1
বিভিন্ন পদ্ধতির গতি সময়ের সাথে সাথে ব্রাউজার সংশোধনগুলির সাথে পরিবর্তিত হয়। লিঙ্ক পরীক্ষা এছাড়াও পরিবর্তিত হয়েছে, এবং এই মন্তব্যকারীকে যেমন সর্বশেষ সংস্করণ এখানে - jsperf.com/number-vs-parseint-vs-plus/39 - সৌভাগ্যবশত সাইটে পরীক্ষার পূর্ববর্তী সংস্করণ পাশাপাশি রয়েছে
Bobo

@ বাবো, নিশ্চিত কৌতূহলের বাইরে ক্রমের সাথে চেক করা - Numberএবং parseIntএখনও বাকিগুলির চেয়ে 99% ধীর। আমার সাথে তারা ভিজ্যুয়ালি খুব কম আকর্ষণীয় :-)
সাওলিয়াস

15
সর্বদা "অকেজো" অপ্টিমাইজেশানের উপর কোডের স্বচ্ছতা পছন্দ করে। বেশিরভাগ ব্যবহারের ক্ষেত্রে parseIntবা Numberবেশি পছন্দসই। আপনি যদি প্রতি সেকেন্ডে কয়েক মিলিয়ন রূপান্তর নিয়ে একটি N64 এমুলেটর প্রোগ্রামিং করে থাকেন তবে আপনি সেই কৌশলগুলি বিবেচনা করতে পারেন।
ngryman

1
প্রশ্ন আচরণ সম্পর্কে, পারফরম্যান্সের আলোচনাটি অফ-টপিক।
বায়ুসংক্রান্ত

1
নোট করুন যে এটি বড় পূর্ণসংখ্যার জন্য ব্যবহার করা যাবে না - বিশেষত পূর্ণসংখ্যা যা স্বাক্ষরিত 32-বিট পূর্ণসংখ্যায় ফিট করে না - কারণ জাভাস্ক্রিপ্টে, বিটওয়াইজ অপারেটররা তাদের অপারেশনগুলিকে দশমিকের চেয়ে 32 বিটের ক্রম হিসাবে বিবেচনা করে, হেক্সাডেসিমাল বা অষ্টাল সংখ্যা। অতএব (2**31).toString() >> 0উপচে পড়া হবে -2147483648। আপনি জাভাস্ক্রিপ্ট অপারেন্ডকে একটি স্বাক্ষরবিহীন 32-বিট পূর্ণসংখ্যার হিসাবে ব্যবহার করার >>>পরিবর্তে ব্যবহার করতে পারেন তবে তার চেয়ে বড় কোনও সংখ্যাও উপচে পড়বে। >>2**32 - 1
hasc


6

একটি ছোট পার্থক্য হ'ল তারা যা রূপান্তর করে undefinedবা null,

Number() Or Number(null) // returns 0

যখন

parseInt() Or parseInt(null) // returns NaN

6

সারসংক্ষেপ:

parseInt():

  • প্রথম আর্গুমেন্ট হিসাবে একটি স্ট্রিং নেয়, রেডিক্স (একটি পূর্ণসংখ্যা যা একটি সংখ্যার সিস্টেমের ভিত্তি, যেমন দশমিক 10 বা বাইনারি 2) দ্বিতীয় আর্গুমেন্ট হিসাবে
  • ফাংশনটি একটি পূর্ণসংখ্যার নম্বর দেয়, যদি প্রথম অক্ষরটিকে কোনও সংখ্যায় রূপান্তর করা না যায় NaNতবে ফিরে আসবে।
  • যদি parseInt() ফাংশনটি একটি সংখ্যাসূচক মানের মুখোমুখি হয় তবে এটি বাকী ইনপুট স্ট্রিংটি কেটে ফেলবে এবং অ সংখ্যাগত মান না হওয়া পর্যন্ত কেবল অংশটি পার্স করবে।
  • যদি মূলটি undefined0 বা হয়, জেএস নিম্নলিখিতগুলি ধরে নেবে:
    • যদি ইনপুট স্ট্রিংটি "0x" বা "0 এক্স" দিয়ে শুরু হয় তবে মূলটি 16 (হেক্সাডেসিমাল) হয়, স্ট্রিংটির বাকী অংশটি একটি সংখ্যায় বিভক্ত হয়।
    • যদি ইনপুট মান 0 দিয়ে শুরু হয় তবে রেডিক্সটি 8 (অষ্টাল) বা 10 (দশমিক) হতে পারে। কোন রেডিক্সটি বেছে নেওয়া হয়েছে তা জেএস ইঞ্জিন বাস্তবায়নের উপর নির্ভর করে। ES510 ব্যবহার করা উচিত তা নির্দিষ্ট করে। তবে এটি সমস্ত ব্রাউজার দ্বারা সমর্থিত নয়, সুতরাং আপনার সংখ্যাটি 0 দিয়ে শুরু করতে পারলে সর্বদা রেডিক্স নির্দিষ্ট করুন।
    • যদি ইনপুট মানটি কোনও সংখ্যার সাথে শুরু হয়, তবে মূলটি 10 ​​হবে

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


5

আমি সর্বদা পার্সিয়ান্ট ব্যবহার করি তবে শীর্ষস্থানীয় শূন্যগুলি থেকে সাবধান থাকুন যা এটি অষ্টাল মোডে বাধ্য করবে ।


35
আমি মনে করি parseInt(value, radix)যে দুর্ঘটনাজনিত অক্টাল মোড রূপান্তর ইত্যাদির মতো আপনার কাছে এমনভাবে কোনও রেডিক্স সরবরাহ করা সর্বদা একটি ভাল ধারণা
অ্যাডোসো

লিডিং শূণ্যসমূহ হবে ECMAScript 3 এর নাম ECMAScript 5 অকট্যাল মোডে ফোর্স নিয়ে এটা বিশ্লেষণ করতে হবে 0, এমনকি অ কঠোর মোডে। তবে এটি স্থির করা হয়েছে এবং এখন নেতৃস্থানীয় শূন্যগুলি কেবল উপেক্ষা করা হবে, তাই parseInt("070")হয়ে যাবে 70
পাইট্রেইক হ্রিসিউক

2
আপনার পাশাপাশি একটি ল্যাটার ব্যবহার করা উচিত যা আপনাকে একটি রেডিক্স মান সরবরাহ করতে সতর্ক করবে parseInt()
জাস্টিন

2

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()ফাংশনটি ব্যবহার করা উচিত


1

parseInt একটি পূর্ণসংখ্যার সংখ্যায় রূপান্তর করে, এটি দশমিককে পৃথক করে। সংখ্যা পূর্ণসংখ্যায় রূপান্তর করে না।


1

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

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) সবকটি পারে একই ধরণের জিনিসগুলি করুন যেমন এই ধরণের বাগগুলি ছাড়াই পার্সেন্ট ব্যবহার করা যেতে পারে।

আপনি যদি এর অন্যান্য গুণাবলীর জন্য যদি সত্যিই পার্সইন্ট ব্যবহার করতে চান বা প্রয়োজন হয় তবে এটি কখনও ফ্লোটকে ইনসে রূপান্তর করতে ব্যবহার করবেন না।

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