parseInt বনাম unary প্লাস, কখন ব্যবহার করবেন?


149

এই লাইনের মধ্যে পার্থক্যগুলি কী:

var a = parseInt("1", 10); // a === 1

এবং এই লাইন

var a = +"1"; // a === 1

এই জেএসপিআইপি পরীক্ষাটি দেখায় যে ইউনারি অপারেটরটি বর্তমান ক্রোম সংস্করণে অনেক দ্রুত, এটি ধরে নিলে এটি নোড.জেএস !

যদি আমি ধর্মান্তরিত স্ট্রিং যা সংখ্যার উভয় রিটার্ন নয় চেষ্টা NaN:

var b = parseInt("test" 10); // b === NaN
var b = +"test"; // b === NaN

তাহলে আমি কখন parseIntইউনারি প্লাস (বিশেষত নোড.জেএস) ব্যবহার করতে পছন্দ করব ???

সম্পাদনা : এবং ডাবল টিলড অপারেটরের সাথে পার্থক্য কী ~~?


উত্তর:


169

কেস আরও সম্পূর্ণ সেট জন্য দয়া করে এই উত্তর দেখুন




ভাল, আমি জানি কিছু পার্থক্য এখানে:

  • একটি খালি স্ট্রিং ""একটি মূল্যায়ণ 0, যখন parseIntমূল্যায়ণ এটি NaN। আইএমও, একটি ফাঁকা স্ট্রিং একটি হওয়া উচিত NaN

    +'' === 0;              //true
    isNaN(parseInt('',10)); //true
    
  • দশমিকগুলি গ্রহণ করার পরেও অ্যানারি +আরও বেশি কাজ করে parseFloat

    parseIntঅন্যদিকে পার্স যখন এটি একটি অ-সংখ্যাসূচক চরিত্র দেখেন, কাল যে একটি দশমিক বিন্দু হতে দেয়ার উদ্দেশ্যে করা হচ্ছে মত স্টপ .

    +'2.3' === 2.3;           //true
    parseInt('2.3',10) === 2; //true
    
  • parseIntএবং parseFloatপার্স এবং স্ট্রিং বাম থেকে ডানে তৈরি করে । যদি তারা একটি অবৈধ চরিত্র দেখতে পায় তবে এটি কোনও সংখ্যার হিসাবে পার্স করা হয়েছে (যদি থাকে তবে) এবং NaNযদি কোনও সংখ্যার মতো পার্স হয় না তবে তা ফিরিয়ে দেয় ।

    পুরো স্ট্রিংটি কোনও সংখ্যায় রূপান্তরযোগ্য না হলে +অন্যদিকে অ্যানারি ফিরে আসবে NaN

    parseInt('2a',10) === 2; //true
    parseFloat('2a') === 2;  //true
    isNan(+'2a');            //true
    
  • @ অ্যালেক্স কে এর মন্তব্যে যেমন দেখা গেছে , parseIntএবং parseFloatচরিত্র অনুসারে পার্স করবে। এই উপায়ে হেক্স এবং এক্সপোনেন্ট স্বরলিপি থেকে ব্যর্থ হবে xএবং e(অন্তত base10 দিকে) অ সংখ্যাসূচক উপাদান হিসাবে গণ্য করা হয়।

    Unary +যদিও তাদের সঠিকভাবে রূপান্তর করবে।

    parseInt('2e3',10) === 2;  //true. This is supposed to be 2000
    +'2e3' === 2000;           //true. This one's correct.
    
    parseInt("0xf", 10) === 0; //true. This is supposed to be 15
    +'0xf' === 15;             //true. This one's correct.
    

6
এছাড়াও যখন কোনও রেডিক্স ব্যবহার করেন+"0xf" != parseInt("0xf", 10)
অ্যালেক্স কে।

আমি আপনার উত্তরটি এতদূর পছন্দ করি, আপনি কি ডাবল টিলড অপারেটরের পার্থক্যটিও ব্যাখ্যা করতে পারেন?
7878

এটি এখানে ব্যাখ্যা করা হবে । এটি এর বিটওয়াস সমতুল্য Math.floor(), যা মূলত দশমিক অংশটিকে ছাড়িয়ে যায়।
জোসেফ

4
আসলে, এর "2e3"জন্য কোনও বৈধ পূর্ণসংখ্যার উপস্থাপনা নয় 2000। এটি একটি বৈধ ভাসমান পয়েন্ট নম্বর যদিও: উত্তর হিসাবে parseFloat("2e3")সঠিকভাবে ফলিত হবে 2000। এবং "0xf"কমপক্ষে ১ base বেসের প্রয়োজন, যার কারণেই parseInt("0xf", 10)রিটার্ন আসে 0, যেখানে parseInt("0xf", 16)আপনি প্রত্যাশিত ১৫ টির মান ফেরত দেয়।
বার্ট

2
@ জোসেফ দ্য ড্রিমার এবং @ হ্যান্ড ইন্ডো 78: ডাবল টিল্ড সংখ্যার দশমিক অংশটি কেটে দেয়, যখন ম্যাথ.ফ্লুর নিকটতম নীচের সংখ্যাটি প্রদান করে। তারা ইতিবাচক সংখ্যার জন্য একই কাজ করে তবে Math.floor(-3.5) == -4এবং ~~-3.5 == -3
আলবিন 11

261

চূড়ান্ত যা-সংখ্যার রূপান্তর টেবিল: রূপান্তর টেবিল


2
"NaN"এই টেবিল যোগ করুন ।
ছারভে

isNaNএই টেবিলটিতে এটি একটি কলাম যুক্ত করার মতো হতে পারে : উদাহরণস্বরূপ, isNaN("")এটি মিথ্যা (যেমন এটি একটি সংখ্যা হিসাবে বিবেচিত), তবে parseFloat("")এটি NaNএকটি গোচা হতে পারে, যদি আপনি isNaNইনপুটটি পাস করার আগে বৈধ করার জন্য চেষ্টা করছেনparseFloat
রেসটাম

আপনারও '{valueOf: function(){return 42}, toString: function(){return "56"}}'তালিকায় যুক্ত হওয়া উচিত । মিশ্র ফলাফল আকর্ষণীয়।
মুররেজু

3
সুতরাং, টেবিলের +সংক্ষিপ্তসারটি হ'ল এটি কেবল লেখার ছোট একটি উপায় Number, এবং ফ্রটারগুলি কেবল এটি করার পাগল উপায় যা প্রান্তের ক্ষেত্রে ব্যর্থ হয়?
মিহাইল ম্যালোস্টানিডিস

[] .অনুদ্দিষ্ট জিনিস, বা এটি কি কেবল নির্বিচারে উত্পন্ন করার এক স্বেচ্ছাসেবী উপায়? গুগলের মাধ্যমে জেএস সম্পর্কিত "অপরিশোধিত" কোনও রেকর্ড খুঁজে পাচ্ছে না।
jcairney

10

আমি বিশ্বাস করি যে thg435 এর উত্তরের সারণীটি ব্যাপক, তবে আমরা নিম্নলিখিত নিদর্শনগুলির সাথে সংক্ষিপ্ত করতে পারি:

  • অ্যানারি প্লাস সমস্ত মিথ্যা মানগুলি একই আচরণ করে না, তবে সেগুলি মিথ্যা বলেই প্রকাশিত হয়।
  • ইউনারী প্লাস পাঠায় true1, কিন্তু "true"করতে NaN
  • অন্যদিকে, parseIntখাঁটি অঙ্ক নয় এমন স্ট্রিংগুলির জন্য আরও উদার। parseInt('123abc') === 123, যেখানে +রিপোর্ট NaN
  • Numberবৈধ দশমিক সংখ্যা গ্রহণ করবে, যেখানে দশমিকের চেয়ে parseIntনিছক সবকিছু বাদ দেয়। সুতরাং parseIntসি আচরণ নকল করে, তবে সম্ভবত ব্যবহারকারী ইনপুট মূল্যায়নের জন্য আদর্শ নয়।
  • উভয় স্ট্রিং মধ্যে সাদা স্পেস ছাঁটাই।
  • parseInt, একটি খারাপভাবে ডিজাইন করা পার্সার হওয়ায় অক্টাল এবং হেক্সাডেসিমাল ইনপুট গ্রহণ করে। ইউনারি প্লাস কেবল হেক্সাডেমিক্যাল লাগে।

মিথ্যা মানগুলি সিতে Numberকী বোঝায় তা নিম্নলিখিতগুলিতে রূপান্তর করে : nullএবং falseউভয়ই শূন্য। ""0 এ যাওয়া এই কনভেনশনটি পুরোপুরি অনুসরণ করে না তবে এটি আমার কাছে যথেষ্ট তাৎপর্যপূর্ণ।

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


2
"ইউনারি প্লাস কেবলমাত্র হেক্সাডেসিমাল নেয়" আপনার দশমিক বলতে চাইছেন না?
ক্রিলগার

0

সাবধান থাকুন, পার্সইটি নোড.জেএস-তে + ইউনিরি অপারেটরের চেয়ে দ্রুত, এটি মিথ্যা যে + বা | 0 দ্রুততর, কেবলমাত্র এনএন উপাদানগুলির জন্য সেগুলি দ্রুত।

এটা দেখ:

var arg=process.argv[2];

rpt=20000;
mrc=1000;

a=[];
b=1024*1024*1024*1024;
for (var i=0;i<rpt;i++)
 a[i]=Math.floor(Math.random()*b)+' ';

t0=Date.now();
if ((arg==1)||(arg===undefined))
 for (var j=0;j<mrc;j++) for (var i=0;i<rpt;i++) {
  c=a[i]-0;
 }
t1=Date.now();
if ((arg==2)||(arg===undefined)) {
 for (var j=0;j<mrc;j++) for (var i=0;i<rpt;i++) {
  d=a[i]|0;
 }
}
t2=Date.now();
if ((arg==3)||(arg===undefined)) {
 for (var j=0;j<mrc;j++) for (var i=0;i<rpt;i++) {
  e=parseInt(a[i]);
 }
}
t3=Date.now();
 if ((arg==3)||(arg===undefined)) {
 for (var j=0;j<mrc;j++) for (var i=0;i<rpt;i++) {
  f=+a[i];
 }
}
t4=Date.now();

console.log(a[i-1],c,d,e,f);
console.log('Eseguiti: '+rpt*mrc+' cicli');
console.log('parseInt '+(t3-t2));
console.log('|0 '+(t2-t1));
console.log('-0 '+(t1-t0));
console.log('+ '+(t4-t3));

-3

কর্মক্ষমতাও বিবেচনা করুন । আমি অবাক হয়ে গিয়েছিলাম যে parseIntআইওএসে অবিচ্ছিন্ন প্লাসকে মারধর করে :) এটি কেবল ভারী সিপিইউ খরচযুক্ত ওয়েব অ্যাপ্লিকেশনগুলির জন্য সহায়ক। থাম্বের নিয়ম হিসাবে আমি আজকাল মোবাইল পারফরম্যান্সের দৃষ্টিকোণ থেকে জেএস অপ্ট-গাইসকে যে কোনও জেএস অপারেটরের বিবেচনা করার জন্য পরামর্শ দিচ্ছি।

সুতরাং, প্রথম মোবাইল যান ;)


অন্য পোস্টগুলিতে যেমন বর্ণনা করা হয়েছে যে তারা বেশ কিছু ভিন্ন কাজ করে, তাই আপনি সহজেই
অন্যটির

@ বার্গি, ঠিক আছে, তবে তাদের মধ্যে অনেকগুলি মিল রয়েছে। আমাকে জাভাস্ক্রিপ্টে কেবলমাত্র একটি পারফরম্যান্স সলিউশন বলুন যা অবশ্যই একমাত্র সঠিক পছন্দ? সাধারণভাবেই তাই আমাদের জন্য নিয়ম-আঙ্গুলগুলি রয়েছে। বাকিটি টাস্ক-নির্দিষ্ট is
আরমান ম্যাকহেষ্টিয়ান

3
@ আরমান এমসিহোটারিয়ান এটি অকেজো মাইক্রোপটিমাইজেশন এবং এটি এর পক্ষে মূল্য দেয় না। এই নিবন্ধটি দেখুন - fabien.potencier.org/article/8/…
ওয়েবভিটালি

@ ওয়েভভিটি, চমৎকার নিবন্ধ। সেখানে সবসময় খুব পারফেক্ট-ওরিয়েন্টেড ছেলেরা থাকে যারা কেবল "দ্রুততম" কোডটি লিখতে পছন্দ করে এবং কিছু নির্দিষ্ট প্রকল্পে এটি খারাপ না। সে কারণেই আমি "জেএস ​​অপ্ট-গাইগুলি বিবেচনা করার জন্য" উল্লেখ করেছি। এটি অবশ্যই আবশ্যক নয় :), তবে আমি নিজেও এটিকে আরও অনেক পাঠযোগ্য বলে মনে করি।
আরমান ম্যাকহায়টিভ

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