একটি জাভাস্ক্রিপ্ট যদি একাধিক শর্তযুক্ত বিবৃতি তাদের সমস্ত পরীক্ষা করে?


100

জাভাস্ক্রিপ্টে, যদি পরীক্ষার জন্য একাধিক শর্তাবলী সহ যদি একটি বিবৃতি ব্যবহার করা হয়, তখন জাভাস্ক্রিপ্টগুলি তাদের নির্বিশেষে সকলের পরীক্ষা করে না, বা এটি ইতিমধ্যে মিথ্যা থাকলে সেগুলি পরীক্ষার আগে এটি জামিন করবে?

উদাহরণ স্বরূপ:

 a = 1
 b = 2
 c = 1

 if (a==1 && b==1 && c==1)

জাভাস্ক্রিপ্টের এই তিনটি শর্তের জন্য পরীক্ষা হবে বা দেখার পরে খ যে 1 এর সমান হয় না, এবং তাই মিথ্যা, তা কি বিবৃতি থেকে প্রস্থান করবে?

আমি একটি পারফরম্যান্স দৃষ্টিকোণ থেকে জিজ্ঞাসা। উদাহরণস্বরূপ, যদি আমি 3 জটিল jQuery নির্বাচনকারীদের পরীক্ষা করে যাচ্ছি যে আমি বরং jQuery ডমকে 3 বার অতিক্রম করিনি যদি এটি প্রথমটির মাধ্যমে স্পষ্ট হয় যে এটি মিথ্যা ফেরত চলেছে। (কোন ক্ষেত্রে যদি বিবৃতি দেওয়া হয় তবে এটি নীড় 3 আরও বোধগম্য হবে)।

যোগসূত্র: একটি কৌতূহল আরও, এর জন্য উপযুক্ত শব্দটি কী? আমি লক্ষ্য করেছি যে আপনারা অনেকে 'শর্ট সার্কিট' শব্দটি ব্যবহার করেন। এছাড়াও, কিছু ভাষা কি এগুলি করে এবং অন্যরা তা না করে?


@ জোশ: আমি এই ধারণাটি মাইক্রো-অপ্টিমাইজেশান বলে সম্পূর্ণ প্রশংসা করি। যা জানা ভাল। এটি বলেছিল যে যদি একটি বিকল্প অন্যের চেয়ে বেশি অনুকূলিত হয় তবে আমি অনুমান করি যে এটি জানা পদ্ধতিটি ব্যবহার করার অভ্যাসটি জানা এবং জেনে রাখা ভাল। (প্লাস, ভাল, আমি উত্তর সম্পর্কে ঠিক কৌতূহলী ছিলাম)
ডিএ।

21
কড়া কথা বলতে গেলে এটি কোনও অকালীন অপটিমাইজেশন নয়। সংক্ষিপ্ত-সার্কিট যুক্তিযুক্ত ভাষাগুলিতে, কোন পদ্ধতিতে কোন পদ্ধতি কার্যকর করা হবে না তা জানতে গুরুত্বপূর্ণ; যদি আপনি তাদের পার্শ্ব প্রতিক্রিয়াগুলির উপর নির্ভর করে থাকেন, উদাহরণস্বরূপ।
রব

5
"শর্ট সার্কিট মূল্যায়ন" সম্পর্কে এখানে আরেকটি প্রশ্ন এখানে রয়েছে: stackoverflow.com/questions/1232603/…
ডেভিড

@ ডেভিড ধন্যবাদ! আকর্ষণীয় পড়া।
ডিএ

উত্তর:


152

&&অপারেটর "স্বল্প সার্কিট" - হয় যে, যদি বাম শর্ত মিথ্যা, এটা ঠিক এক মূল্যায়নের মাথা ঘামান না।

একইভাবে, ||অপারেটর শর্ট সার্কিট যদি বাম শর্তটি সত্য হয়।

সম্পাদনা: যদিও, আপনি বেঞ্চমার্ক না করে এবং নির্ধারণ না করেছেন যে এটি একটি সমস্যা না হওয়া অবধি আপনার কর্মক্ষমতা নিয়ে চিন্তা করা উচিত নয়। অকাল মাইক্রো-অপ্টিমাইজেশন হ'ল রক্ষণাবেক্ষণের বিরক্তি।


4
দুর্দান্ত উত্তর (প্রযুক্তিগত অংশ এবং পরিচালন সমস্যা উভয়)। ধন্যবাদ!
ডিএ

5
আপনি যদি কখনও এটি ব্যবহার করতে চান তবে আপনি এবং এবং | এবং এবং বা repspectively
Zoidberg

25
এই অবস্থাটি সর্বদা কর্মক্ষমতা সম্পর্কে নয়। কখনও কখনও আপনি একটি নাল চেক করছেন এবং বলতে পারেন যে যদি আপনার নাল চেকটি শর্ত হয় এবং তারপরে আপনি নিজের দ্বিতীয় চেকের জন্য একটি (b == মান + 1) করার চেষ্টা করেন তবে শর্তাদি পরীক্ষা করা থাকলে তিনটি শর্তেই ত্রুটি পাবেন।
ইনফোসাইড 21

4
প্রকৃতপক্ষে, সংক্ষিপ্ত সার্কিট কর্মক্ষমতা সম্পর্কে নয় about মূল প্রশ্নটি তবে পারফরম্যান্সের দিক থেকে জিজ্ঞাসা করেছিল।
আনন

4
খুব ভালো. এই ধরণের মাইক্রো অপ্টিমাইজেশান (অন্যদের মধ্যে) করা একটি স্ক্রোল ইভেন্ট লুপের ভিতরে একটি বড় প্রভাব ফেলতে পারে, উদাহরণস্বরূপ বা এমনকি স্টিকি বারের জন্য একাধিক উপাদানগুলির প্যারাল্যাক্স গণনার জন্য বলি। এটি প্রাক্তন করুন: if (!barSticky && bar.parent().offset().top <= document.documentElement.scrollTop)দ্বিতীয় শর্তটি আরও ব্যয়বহুল গণনা, প্রথমটি কেবল একটি বুলিয়ান। :)
অ্যান্টনি

13

পারফরম্যান্সের দিক থেকে, এটি কোনও মাইক্রো-অপ্টিমাইজেশন নয়।

যদি আমাদের কাছে 3 বুলিয়ান ভেরিয়েবল থাকে, a, b, c যা একটি মাইক্রো-অপ্টিমাইজেশন।

যদি আমরা 3 ফাংশনগুলিতে কল করি যা বুলিয়ান ভেরিয়েবলগুলি ফিরিয়ে দেয়, প্রতিটি ফাংশনটিতে দীর্ঘ সময় লাগতে পারে এবং কেবল এই শর্ট সার্কিটগুলি জানা গুরুত্বপূর্ণ নয়, তবে কী ক্রমে। উদাহরণ স্বরূপ:

if (takesSeconds() && takesMinutes())

তুলনায় অনেক ভাল

if (takesMinutes() && takesSeconds())

যদি উভয়ই সমানভাবে মিথ্যা প্রত্যাবর্তনের সম্ভাবনা থাকে।


12

এজন্য আপনি জাভাস্ক্রিপ্ট কোডের মতো করতে পারেন

var x = x || 2;

যার অর্থ হ'ল x যদি অপরিজ্ঞাত বা অন্যথায় 'মিথ্যা' হয় তবে ডিফল্ট মান 2 হয়।


4
জেএস শর্ট সার্কিট মূল্যায়ন সমর্থন না করে এমনকি এটি কাজ করতে পারে।
pswg

4
এটি কি একটি বার্ষিকের সমতুল্য?
মার্ক কার্পেন্টার জুনিয়র

10

যদি কারও ভেবে অবাক হয় যে সমস্ত অবস্থার মূল্যায়নের জন্য জোর করার কোনও উপায় আছে , কিছু ক্ষেত্রে বিটওয়াইজ অপারেটর &এবং |ব্যবহার করা যেতে পারে

var testOr = true | alert(""); //alert pops up
var testAnd = false & alert(""); //alert pops up

এগুলি সত্যই সাবধানে ব্যবহার করা উচিত কারণ বিটওয়াইজ অপারেটরগণগণিতগণিতগণগণিত অপারেটর যা তাদের অপারেন্ডের একক বিটের উপরে কাজ করে এবং সর্বদা "নন শর্ট সার্কিট" সংস্করণ হিসাবে কাজ করতে পারে না &&এবং||

উদাহরণ:

-2147483648 && 1 = 1 

কিন্তু

-2147483648 & 1 = 0

আশা করি এটি এখানে পৌঁছে এমন কাউকে এই জাতীয় তথ্য অনুসন্ধান করতে সহায়তা করেছে (আমার মতো) এবং সংশোধন ও পাল্টা-উদাহরণের জন্য @ ম্যাক্সকে ধন্যবাদ


4
এই উত্তরটি ভুল। এবং এবং | বিটওয়াইস অপারেটর, এগুলি && এবং || এর শর্ট সার্কিট সংস্করণ নয়। বিটওয়াইজ অপারেটরগণগণিতগণিত অপারেটর যা তাদের অপারেন্ডের একক বিটগুলিতে কাজ করে। উদাহরণ: -2147483648 && 1 = 1 তবে -2147483648 এবং 1 = 0. আরও তথ্য এখানে: en.wikedia.org/wiki/Bitwise_operation
সর্বোচ্চ

4
@ ম্যাক্স আসলে আমি এটি জানতাম না, আমি সি ব্যবহার করছি, যেহেতু আমি (এখন আমি "কৌশল" বলি) ভাগ্যক্রমে এমন কোড যা আমার কোডটি ভেঙে ফেলত তা কখনই সামনে আসেনি। আমি আমার উত্তরটি সংশোধন করেছি, আমি তোমার কাছে
--ণী

@ ডিজেড্যাভমার্ক দুঃখিত, আমি আপনার false && (alert(""))সমাধানটি সমাধান করতে
পারিনি

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

মূল্যায়নের জন্য বল প্রয়োগ করার সহজ ও সর্বোত্তম উপায় হ'ল ভেরিয়েবলের ফলাফলগুলি সংরক্ষণ করা এবং তারপরে ভেরিয়েবলের বিরুদ্ধে পরীক্ষা করা:var a=false; var b=check(); alert(a && b);
ডিজেড্যাভমার্ক

7

এটি কেবলমাত্র সমস্ত শর্ত পরীক্ষা করে যদি প্রথমটি সত্য হয়, নিজের জন্য এটি পরীক্ষা করুন:

javascript: alert (false && alert("A") && false);

3

এটি সংক্ষিপ্ত সার্কিট - আপনার উদাহরণে কেবল একটি এবং খের তুলনা করা হবে।


3

বাম দিকে 1 বা আরও বেশি পরামিতি সহ মূল্যায়ন বন্ধ করার আরও একটি কারণ।

যদি (প্রতিক্রিয়া.অর্থরেসপোনস && (প্রতিক্রিয়া.আউথরেস্পোনস.এ্যাকসেসটোকেন! = ইউজারআ্যাকসেসটোকেন)) {...}

দ্বিতীয় মূল্যায়ন প্রথমটি সত্য হওয়ার উপর নির্ভর করে এবং প্রতিক্রিয়া থাকলে একটি সংকলন ত্রুটি ফেলবে না a

অন্যান্য ভাষাগুলির প্রথম দিনগুলিতে এই সমস্যা ছিল এবং আমি মনে করি এটি এখন কম্পাইলারগুলি তৈরির ক্ষেত্রে একটি আদর্শ পদ্ধতি approach



2

এই প্রশ্নের যে কারও জন্য বিভ্রান্ত কারণ তারা ||কোনও ?অপারেটরের সাথে এটি ব্যবহার করে যখন শর্ট সার্কিট আচরণটি দেখছেন না :

x = 1 || true ? 2 : 3 // value of x will be 2, rather than 1 as expected

দেখে মনে হচ্ছে শর্ট সার্কিট বিধি কাজ করছে না। ||প্রথমটি সত্য হওয়ার পরে কেন এটি দ্বিতীয় শব্দটির (সত্য? 2: 3) মূল্যায়ন করছে ? এটি অপারেশন সমস্যার ক্রম হিসাবে প্রমাণিত হয়েছে কারণ উপরেরটির সমতুল্য

x = (1 || true) ? 2 : 3

সঙ্গে ||প্রথম মূল্যায়ন এবং ?দ্বিতীয় মূল্যায়ন করেন। আপনি সম্ভবত যা চান তা হ'ল:

x = 1 || (true ? 2 : 3)

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