বুলিয়ান ফলাফলটিকে সংখ্যা / পূর্ণসংখ্যায় রূপান্তর করুন


276

আমার একটি পরিবর্তনশীল আছে যা সঞ্চয় করে falseবা true, তবে আমার প্রয়োজন হয় 0বা 1পরিবর্তে যথাক্রমে। কিভাবে আমি এটি করতে পারব?


8
এখানে সরবরাহিত কয়েকটি কৌশলগুলির একটি পারফরম্যান্স তুলনা করা হয়েছে: jsperf.com/conversion-from-boolean-to-number
স্যাম

4
নোড.জেএস ব্যবহারকারীরা bool === true ? 1 : 0এটি ব্যবহার করতে চান , এটি ভি 8-র মধ্যে এখন পর্যন্ত সবচেয়ে দ্রুততম।
কিউস - মনিকো

3
বা কেবলbool ? 1 : 0;
আতরাহিসিস

উত্তর:


343

জাভাস্ক্রিপ্টের একটি টেরিনারি অপারেটর রয়েছে আপনি ব্যবহার করতে পারেন:

var i = result ? 1 : 0;

7
সর্বোত্তম উত্তর. কেন? Truthiness যা আরও সাধারণ এবং কোনো ধরনের গ্রহণ (STRING, সংখ্যা, ইত্যাদি।) ইউনারী উত্তর প্রকৃতপক্ষে চালাক, কিন্তু যদি আমি এটি একটি স্ট্রিং এটা ফেরৎ পাস এই কাজ NaN। সুতরাং আপনি যদি এল 33 টি চান এবং ইনপুটটির গ্যারান্টি দিয়ে থাকেন তবে তাড়াতাড়ি যান, অন্যথায় ত্রৈমাসিকের সাথে মিথ্যা + সত্যবাদী পরীক্ষাটি সেরা।
gdibble

465

অ্যানারি +অপারেটর ব্যবহার করুন , এটির অপারেন্ডকে একটি সংখ্যায় রূপান্তর করে।

+ true; // 1
+ false; // 0

নোট, অবশ্যই, আপনার এখনও সার্ভার সাইডের ডেটা স্যানিটাইজ করা উচিত, কারণ কোনও ব্যবহারকারী ক্লায়েন্ট-সাইড কোড যা বলুক না কেন, আপনার সেভারে কোনও ডেটা প্রেরণ করতে পারে।


50
তবুও শীতল (আমি এটি সম্পর্কে কখনই ভাবিনি), এটি অবিশ্বাস্যরূপে ধীর (ক্রোমে ধীরে ধীরে 97% ধীর)। সতর্ক হতে হবে!
কিউস - মনিকা

5
এই সংশোধন পরীক্ষা করে দেখুন । Number()এমনকি ধীর।
কিউস - মনিকি

23
এটি উপস্থিত bool === true ? 1 : 0থেকে দ্রুততম, এর কাছাকাছি দ্বিতীয়টি রয়েছে bool | 0
কিউস - মনিকি

1
গুণ করা (যেমন 3 * মিথ্যা) খুব ভুল মনে হয় তবে এটি কার্যকর হয়। :) ধন্যবাদ!
ম্যাটসওয়েভ

1
@ ডেরকজানস্পিলম্যান এই সত্য যে যে কিছু টাইপসক্রিপ্টে অনুমোদিত নয় তার অর্থ এটি জাভাস্ক্রিপ্টে করা উচিত নয়। এগুলি আলাদা (যদিও সম্পর্কিত) ভাষা।
একাকী দিন

119

ইমো সবচেয়ে ভাল সমাধান:

fooBar | 0

এটি asm.js এ পূর্ণসংখ্যার ধরণের বল প্রয়োগ করতে ব্যবহৃত হয়।


দ্রুততম এক; +1 টি।
কিউস - মনিকি

3
সুন্দর. এছাড়াও আপনি "বুলিয়ান ^ 0" ব্যবহার করতে পারেন। বা বা XOR কাজ করে।
F8ER

এটি 1fooBar না হলে এটি পূর্ণসংখ্যা ফেরত দেবে না?
ESR

58

আমি সংখ্যা ফাংশন ব্যবহার করতে পছন্দ করি । এটি একটি অবজেক্ট নেয় এবং এটিকে একটি সংখ্যায় রূপান্তর করে।

উদাহরণ:

var myFalseBool = false;
var myTrueBool = true;

var myFalseInt = Number(myFalseBool);
console.log(myFalseInt === 0);

var myTrueInt = Number(myTrueBool);
console.log(myTrueInt === 1);

আপনি এটি জেএসফিডেলে পরীক্ষা করতে পারেন ।


3
এটি এখন পর্যন্ত সেরা উত্তর। অবশ্যই নীচে। কেবল "এটি কোনও বস্তু নেয়" সঠিক নয়।
Rudie

2
এমডিএন-এর লিঙ্কটি ডাব্লু 3 স্কুলগুলির চেয়ে অনেক ভাল (উদাহরণস্বরূপ!): বিকাশকারী.মোজিলা.আর.ইন.ইউএস
ডকস / ওয়েব

আমি মনে করি এটি সবচেয়ে ভাল উপায় কারণ এটি পড়া সহজ এবং উদ্দেশ্য-প্রকাশক।
স্যাম

3
এটা তোলে হয় ধীরতম।
কিউস - মনিকি

45

আমি সমস্ত প্রস্তাবিত উত্তরের সাথে একটি জেএসপারফ তুলনা তৈরি করেছি ।

টিএল; ডিআর - সমস্ত বর্তমান ব্রাউজারের জন্য সেরা বিকল্পটি হ'ল:

val | 0;

হালনাগাদ:

আজকের দিনের মতো মনে হচ্ছে এগুলি সকলেই বেশ অভিন্ন, ব্যতীত Number()ফাংশনটি সবচেয়ে ধীরে, যদিও সবচেয়ে ভাল val === true ? 1 : 0;


2
মজার বিষয় হল, ম্যাকোস 10.13.3 এ ক্রোম এখন ক্রম 64.0.3282 এ টের্নারিটি দ্রুততম।
2540625

এটি সেই সময়ে সবচেয়ে দ্রুত বিকল্প হবে। এটি সেরা বিকল্প হতে এটি থেকে পৃথক।
মাইকম্যাকানা


30

আমি আজ এই শর্টকাট জুড়ে এসেছি।

~~ (সত্য)

~~ (মিথ্যা)

আমার তুলনায় অনেক বেশি চৌকস লোকেরা:

http://james.padolsey.com/javascript/double-bitwise-not/


2
মজাদার. আমি আজ নতুন কিছু শিখেছি. আমি কোনও প্রকল্পে এই কৌশলটি ব্যবহার করব না, যদিও এর সম্ভাবনা ভবিষ্যতে-আমাকে বা সতীর্থদের বিভ্রান্ত করার।
নিকোলাইডস

1
হ্যাকি জেএস আমার পছন্দসই। গুরুতরভাবে, +1
টড

16

যখন জাভাস্ক্রিপ্ট কোনও সংখ্যার মান প্রত্যাশা করে তবে বুলিয়ান গ্রহণ করে পরিবর্তে এটি সেই বুলিয়ানকে একটি সংখ্যায় রূপান্তর করে: যথাক্রমে সত্য এবং মিথ্যা রূপান্তরিত করে 1 এবং 0। সুতরাং আপনি এই সুবিধা নিতে পারেন;

var t = true;
var f = false;

console.log(t*1); // t*1 === 1
console.log(f*1); // f*1 === 0 

console.log(+t); // 0+t === 1 or shortened to +t === 1
console.log(+f); //0+f === 0 or shortened to +f === 0

জাভাস্ক্রিপ্টের সংজ্ঞা নির্দেশিকাটির আরও পাঠের ধরণের রূপান্তর অধ্যায় 3.8 পড়ুন।


13

Unary +অপারেটর এটি যত্ন নেবে:

var test = true;
// +test === 1
test = false;
// +test === 0

আপনি সংরক্ষণ করার আগে এটি স্বাভাবিকভাবেই সার্ভারে স্যানিটি-চেক করতে চাইবেন, তবে যাইহোক, এটি করার এটি আরও বোধগম্য জায়গা হতে পারে।


আমি মন্তব্যগুলিতে পরিবর্তিত হয়েছি ===, কারণ true == 1"স্পষ্টত রূপান্তর :-) true === 1পরিবর্তে এটি মিথ্যা বলেও সত্য
xanatos

13

আমি লিখেছিলাম এমন কিছু কোডে আমি এই সমস্যাটি নিয়ে কাজ করছি। আমার সমাধানটি ছিল খানিকটা ব্যবহার করা এবং।

var j = bool & 1;

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

function toInt( val ) {
    return val & 1;
}

var j = toInt(bool);

সম্পাদনা করুন - 10 সেপ্টেম্বর, 2014

কোনও কারণে টার্মিনেট অপারেটরটি অপারেটরটির সাথে অভিন্ন হিসাবে কোনও রূপান্তর ক্রোমে দ্রুততর হয় না। এটি কেন দ্রুততর তা সম্পর্কে কোনও ধারণা দেয় না তবে আমি মনে করি এটি নিম্ন স্তরের অপ্টিমাইজেশনের কিছু ধরণের যা পথের কোথাও অর্থবোধ করে।

var j = boolValue === true ? 1 : 0;

নিজের জন্য পরীক্ষা করুন: http://jsperf.com/boolean-int-conversion/2

ফায়ারফক্স এবং ইন্টারনেট এক্সপ্লোরারে, আমি পোস্ট করা সংস্করণটি সাধারণভাবে দ্রুত ব্যবহার করা হয়।

সম্পাদনা করুন - 14 ই জুলাই, 2017

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

এছাড়াও, এখানে 'টু ইন্ট' প্রোটোটাইপ যুক্ত করার জন্য একটি নতুন পদ্ধতি যা ওভাররাইট করা যায় না।

Object.defineProperty(Boolean.prototype, "toInt", { value: function()
{
    return this & 1;
}});

এই পোস্টের জন্য আমার দুটি ডাউনভোট ছিল। কেন আপনি এটিকে নিম্নচাপ দিয়েছিলেন তা আপনি ব্যাখ্যা করবেন না। অন্যথায় এটি যুক্তি ছাড়াই কেবল একটি ডাউনভোট।
নিকোলাস আর গ্রান্ট

1
99 বার জেএসপিফার ফলাফল আপনাকে অকাল অপটিমাইজেশন পাথের উপরে নিয়ে যায়, ন্যানোসেকেন্ডগুলি লুপ থেকে অপ্টিমাইজ করে যখন পরিবর্তে সেই কুৎসিত এসকিউএল বিবৃতিতে ফোকাস করা উচিত। এর কাছে পৌঁছানোর কয়েকটি ভিন্ন উপায় সরবরাহ করার জন্য ধন্যবাদ
রোজ্জা

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

এসকিউএল জিনিস 'সাধারণীকরণ দ্বিগুণ। অন্তর্দৃষ্টি জন্য ধন্যবাদ
RozzA

9

আপনি 0 যোগ করতে পারেন, শিফট অপারেটর বা xor ব্যবহার করতে পারেন:

val + 0;
val ^ 0;
val >> 0;
val >>> 0;
val << 0;

এগুলির অন্যদের উত্তরগুলির মতো গতিও রয়েছে।


6

আমার প্রসঙ্গে, নেটিভ প্রতিক্রিয়া যেখানে আমি বুলিয়ান থেকে অস্বচ্ছতার মান পাচ্ছি, সবচেয়ে সহজ উপায়: অ্যানারি + অপারেটর ব্যবহার করুন।

+ true; // 1
+ false; // 0

এটি বুলিয়ানকে সংখ্যায় রূপান্তর করে;

style={ opacity: +!isFirstStep() }

4

আপনি কেবল বুলিয়ান প্রোটোটাইপ প্রসারিত করে এটি করতে পারেন

Boolean.prototype.intval = function(){return ~~this}

সেখানে কী চলছে তা বোঝা খুব সহজ নয় তাই বিকল্প সংস্করণটি কী হবে

Boolean.prototype.intval = function(){return (this == true)?1:0}

আপনি পছন্দসই জিনিস করতে পারেন যা কাজ করে

document.write(true.intval());

আমি যখন শর্তগুলি সঞ্চয় করতে বুলেটিন ব্যবহার করি তখন আমি প্রায়শই তাদের বিটফিল্ডে রূপান্তর করি যার ক্ষেত্রে আমি প্রোটোটাইপ ফাংশনের বর্ধিত সংস্করণ ব্যবহার করে শেষ করি

Boolean.prototype.intval = function(places)
{
 places = ('undefined' == typeof(places))?0:places; 
 return (~~this) << places
}

যা দিয়ে আপনি করতে পারেন

document.write(true.intval(2))

যা এর আউটপুট হিসাবে 4 উত্পাদন করে।




1

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

উবুন্টু সার্ভারে চালিত হয়েছে 14.04, নোডেজগুলি v8.12.0 - 26/10/18

    let i = 0;
console.time("TRUE test1")
    i=0;
    for(;i<100000000;i=i+1){
        true ? 1 : 0;
    }
console.timeEnd("TRUE test1")


console.time("FALSE test2")
    i=0;
    for(;i<100000000;i=i+1){
        false ? 1 : 0;
    }
console.timeEnd("FALSE test2")

console.log("----------------------------")

console.time("TRUE test1.1")
    i=0;
    for(;i<100000000;i=i+1){
        true === true ? 1 : 0;
    }
console.timeEnd("TRUE test1.1")


console.time("FALSE test2.1")
    i=0;
    for(;i<100000000;i=i+1){
        false === true ? 1 : 0;
    }
console.timeEnd("FALSE test2.1")

console.log("----------------------------")

console.time("TRUE test3")
    i=0;
    for(;i<100000000;i=i+1){
        true | 0;
    }
console.timeEnd("TRUE test3")

console.time("FALSE test4")
    i=0;
    for(;i<100000000;i=i+1){
        false | 0;
    }
console.timeEnd("FALSE test4")

console.log("----------------------------")

console.time("TRUE test5")
    i=0;
    for(;i<100000000;i=i+1){
        true * 1;
    }
console.timeEnd("TRUE test5")

console.time("FALSE test6")
    i=0;
    for(;i<100000000;i=i+1){
        false * 1;
    }
console.timeEnd("FALSE test6")

console.log("----------------------------")

console.time("TRUE test7")
    i=0;
    for(;i<100000000;i=i+1){
        true & 1;
    }
console.timeEnd("TRUE test7")

console.time("FALSE test8")
    i=0;
    for(;i<100000000;i=i+1){
        false & 1;
    }
console.timeEnd("FALSE test8")

console.log("----------------------------")

console.time("TRUE test9")
    i=0;
    for(;i<100000000;i=i+1){
        +true;
    }
console.timeEnd("TRUE test9")

console.time("FALSE test10")
    i=0;
    for(;i<100000000;i=i+1){
        +false;
    }
console.timeEnd("FALSE test10")

console.log("----------------------------")

console.time("TRUE test9.1")
    i=0;
    for(;i<100000000;i=i+1){
        0+true;
    }
console.timeEnd("TRUE test9.1")

console.time("FALSE test10.1")
    i=0;
    for(;i<100000000;i=i+1){
        0+false;
    }
console.timeEnd("FALSE test10.1")

console.log("----------------------------")

console.time("TRUE test9.2")
    i=0;
    for(;i<100000000;i=i+1){
        -true*-1;
    }
console.timeEnd("TRUE test9.2")

console.time("FALSE test10.2")
    i=0;
    for(;i<100000000;i=i+1){
        -false*-1;
    }
console.timeEnd("FALSE test10.2")

console.log("----------------------------")

console.time("TRUE test9.3")
    i=0;
    for(;i<100000000;i=i+1){
        true-0;
    }
console.timeEnd("TRUE test9.3")

console.time("FALSE test10.3")
    i=0;
    for(;i<100000000;i=i+1){
        false-0;
    }
console.timeEnd("FALSE test10.3")

console.log("----------------------------")

console.time("TRUE test11")
    i=0;
    for(;i<100000000;i=i+1){
        Number(true);
    }
console.timeEnd("TRUE test11")

console.time("FALSE test12")
    i=0;
    for(;i<100000000;i=i+1){
        Number(false);
    }
console.timeEnd("FALSE test12")

console.log("----------------------------")

console.time("TRUE test13")
    i=0;
    for(;i<100000000;i=i+1){
        true + 0;
    }
console.timeEnd("TRUE test13")

console.time("FALSE test14")
    i=0;
    for(;i<100000000;i=i+1){
        false + 0;
    }
console.timeEnd("FALSE test14")

console.log("----------------------------")

console.time("TRUE test15")
    i=0;
    for(;i<100000000;i=i+1){
        true ^ 0;
    }
console.timeEnd("TRUE test15")

console.time("FALSE test16")
    i=0;
    for(;i<100000000;i=i+1){
        false ^ 0;
    }
console.timeEnd("FALSE test16")

console.log("----------------------------")

console.time("TRUE test17")
    i=0;
    for(;i<100000000;i=i+1){
        true ^ 0;
    }
console.timeEnd("TRUE test17")

console.time("FALSE test18")
    i=0;
    for(;i<100000000;i=i+1){
        false ^ 0;
    }
console.timeEnd("FALSE test18")

console.log("----------------------------")

console.time("TRUE test19")
    i=0;
    for(;i<100000000;i=i+1){
        true >> 0;
    }
console.timeEnd("TRUE test19")

console.time("FALSE test20")
    i=0;
    for(;i<100000000;i=i+1){
        false >> 0;
    }
console.timeEnd("FALSE test20")

console.log("----------------------------")

console.time("TRUE test21")
    i=0;
    for(;i<100000000;i=i+1){
        true >>> 0;
    }
console.timeEnd("TRUE test21")

console.time("FALSE test22")
    i=0;
    for(;i<100000000;i=i+1){
        false >>> 0;
    }
console.timeEnd("FALSE test22")

console.log("----------------------------")

console.time("TRUE test23")
    i=0;
    for(;i<100000000;i=i+1){
        true << 0;
    }
console.timeEnd("TRUE test23")

console.time("FALSE test24")
    i=0;
    for(;i<100000000;i=i+1){
        false << 0;
    }
console.timeEnd("FALSE test24")

console.log("----------------------------")

console.time("TRUE test25")
    i=0;
    for(;i<100000000;i=i+1){
        ~~true;
    }
console.timeEnd("TRUE test25")

console.time("FALSE test26")
    i=0;
    for(;i<100000000;i=i+1){
        ~~false;
    }
console.timeEnd("FALSE test26")

console.log("----------------------------")

console.time("TRUE test25.1")
    i=0;
    for(;i<100000000;i=i+1){
        ~true*-1-1;
    }
console.timeEnd("TRUE test25.1")

console.time("FALSE test26.1")
    i=0;
    for(;i<100000000;i=i+1){
        ~false*-1-1;
    }
console.timeEnd("FALSE test26.1")

console.log("----------------------------")

console.time("TRUE test27")
    i=0;
    for(;i<100000000;i=i+1){
        true/1;
    }
console.timeEnd("TRUE test27")

console.time("FALSE test28")
    i=0;
    for(;i<100000000;i=i+1){
        false/1;
    }
console.timeEnd("FALSE test28")

ফলাফল

TRUE test1: 93.301ms
FALSE test2: 102.854ms
----------------------------
TRUE test1.1: 118.979ms
FALSE test2.1: 119.061ms
----------------------------
TRUE test3: 97.265ms
FALSE test4: 108.389ms
----------------------------
TRUE test5: 85.854ms
FALSE test6: 87.449ms
----------------------------
TRUE test7: 83.126ms
FALSE test8: 84.992ms
----------------------------
TRUE test9: 99.683ms
FALSE test10: 87.080ms
----------------------------
TRUE test9.1: 85.587ms
FALSE test10.1: 86.050ms
----------------------------
TRUE test9.2: 85.883ms
FALSE test10.2: 89.066ms
----------------------------
TRUE test9.3: 86.722ms
FALSE test10.3: 85.187ms
----------------------------
TRUE test11: 86.245ms
FALSE test12: 85.808ms
----------------------------
TRUE test13: 84.192ms
FALSE test14: 84.173ms
----------------------------
TRUE test15: 81.575ms
FALSE test16: 81.699ms
----------------------------
TRUE test17: 81.979ms
FALSE test18: 81.599ms
----------------------------
TRUE test19: 81.578ms
FALSE test20: 81.452ms
----------------------------
TRUE test21: 115.886ms
FALSE test22: 88.935ms
----------------------------
TRUE test23: 82.077ms
FALSE test24: 81.822ms
----------------------------
TRUE test25: 81.904ms
FALSE test26: 82.371ms
----------------------------
TRUE test25.1: 82.319ms
FALSE test26.1: 96.648ms
----------------------------
TRUE test27: 89.943ms
FALSE test28: 83.646ms

0

যদি আপনি পূর্ণসংখ্যার x মান পরিবর্তন করতে চান তবে 1 থেকে 0 এবং যদি 0 থেকে 1 আপনি ব্যবহার করতে পারেন (x + 1)% 2

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