জাভাস্ক্রিপ্টের কি "শর্ট সার্কিট" মূল্যায়ন আছে?


106

আমি জানতে চাই যে জাভাস্ক্রিপ্টের "শর্ট-সার্কিট" মূল্যায়ন সি & # তে && অপারেটরের মতো রয়েছে কিনা। যদি তা না হয় তবে আমি জানতে চাই যে এমন কোনও কর্মপদ্ধতি আছে যা গ্রহণ করার জন্য উপলব্ধি করে।


4
আপনাকে স্বাগতম. https://www.google.com/search?q=site:stackoverflow.com+%sঅনুসন্ধানগুলি গতি বাড়ানোর জন্য আমি অনুসন্ধান শর্টকাট (ক্রোম / ফায়ারফক্স) হিসাবে যুক্ত করেছি ।
রব ডব্লিউ

এছাড়াও এখানে আমার প্রশ্নের বিকাশকারী.মোজিলা.আর.ইন.ইউএস
ডকস / ওয়েব

উত্তর:


123

হ্যাঁ, জাভাস্ক্রিপ্টের "শর্ট সার্কিট" মূল্যায়ন রয়েছে।

if (true == true || foo.foo){
    // Passes, no errors because foo isn't defined.
}

সরাসরি নমুনা

if (false && foo.foo){
    // Passes, no errors because foo isn't defined.
}

সরাসরি নমুনা


9
তাহলে শর্ট সার্কিট কি জেএসের মান?
গিব্বোক

4
ধন্যবাদ গডোরন, দয়া করে আমাকে বুঝতে সাহায্য করুন ... সি # তে আমার মতো বাইনারি অপারেটরও রয়েছে এবং সুতরাং সি এবং
এন্ডের

4
@ গিব্বোক তারপরে, স্পষ্টতই, Short-circuitসেই লজিক অপারেটরটির সাথে কোনও হতে পারে না । শুধু এটি চেষ্টা করুন। আমার ডেমো ব্যবহার করুন।
gdoron মনিকে

4
@ গিব্বোক: এই অপারেটরের রেফারেন্সটি দেখুন । এবং হ্যাঁ, জেএসেও বাইনারি এবং অপারেটর রয়েছে।
বার্গি

4
@ গিব্বোক হ্যাঁ মান! তবে ভাল মন্তব্য, জাভাস্ক্রিপ্ট বাস্তবায়নের ক্ষেত্রে জেআইটি-সংকলন-যাদুবিদ্যার সময়ে, কেউ সত্যিই জানতে চান যে কোনও কিছু "মান", বা সম্ভাব্যভাবে বাস্তবায়নের সাপেক্ষে if পথ বাইনারি লজিক্যাল অপারেটর সঙ্গে একটি শর্ত বিবৃতি মূল্যায়ন করা হয় এবং (স্বল্প curcuit) একটি প্রমিত আচরণ ecma-international.org/ecma-262/5.1/#sec-11.11
humanityANDpeace

26

এই উত্তরটি কীভাবে দুর্দান্ত বিশদে যায় জাভাস্ক্রিপ্টে সমস্ত গোটাচা এবং প্রাসঙ্গিক থিম যেমন অপারেটর অগ্রাধিকার সহ কাজ করে, আপনি যদি একটি দ্রুত সংজ্ঞা খুঁজছেন এবং শর্ট সার্কিট কীভাবে কাজ করে তা ইতিমধ্যে বুঝতে পারছেন তবে আমি অন্যান্য উত্তরগুলি পরীক্ষা করার পরামর্শ দিচ্ছি।


আমরা (ভেবেছিলাম) এতক্ষণ যা জানতাম:

প্রথমে if()ব্লকের অভ্যন্তরে আমরা যে সমস্ত আচরণের সাথে পরিচিত সেগুলি &&পরীক্ষা করে দেখি যেখানে আমরা দুটি জিনিস কিনা তা যাচাই করতে ব্যবহার করি true:

if (true && true) {
   console.log('bar');
} 

: এখন, আপনার প্রথম প্রবৃত্তি সম্ভবত বলতে হয় আহ্ হ্যাঁ, বেশ সহজ, কোড বিবৃতি উভয় যদি executes expr1এবং expr2যেমন মূল্যায়ন করা হয় true'

ভাল, হ্যাঁ এবং না। আপনি প্রযুক্তিগতভাবে সঠিক, আপনি বর্ণিত আচরণটি এটাই, তবে কোডটি কীভাবে মূল্যায়ন করা হয় তা ঠিক তা নয় এবং পুরোপুরি বুঝতে আমাদের আরও গভীরভাবে আঁকতে হবে।


ঠিক কিভাবে &&এবং ||ব্যাখ্যা করা হয় ?:

এটি দেখার সময় "দ্য হুডের নীচে" ইঞ্জিন "। আসুন এই ব্যবহারিক উদাহরণটি বিবেচনা করুন:

function sanitise(x) {
  if (isNaN(x)) {
    return NaN;
  }
  return x;
}

let userinput = 0xFF; // as an example
const res = sanitise(userinput) && userinput + 5

console.log(res);

ঠিক আছে ফলাফল 260.. তবে কেন? উত্তর পাওয়ার জন্য, আমাদের বুঝতে হবে শর্ট সার্কিট মূল্যায়ন কীভাবে কাজ করে।

দ্বারা MDN সংজ্ঞা&& মধ্যে অপারেটর expr1 && expr2followingly মৃত্যুদন্ড কার্যকর হয়:

যদি expr1রূপান্তর করা যায় তবে trueপ্রত্যাবর্তন expr2; অন্যথায়, ফিরে আসে expr1

সুতরাং এর অর্থ হল, আমাদের ব্যবহারিক উদাহরণে const resনিম্নলিখিত পদ্ধতিটি মূল্যায়ন করা হয়:

  1. আমন্ত্রণ expr1-sanitise(0xFF)
  2. 0xFF 250 এর জন্য একটি বৈধ হেক্সাডেসিমাল সংখ্যা, অন্যথায় আমি ফিরে আসব NaN
  3. expr1একটি "truthy" মান ফিরে সময় চালানো expr2 (অন্যথায় আমি বন্ধ চাই যেমন NaNfalsy হয়)
  4. যেহেতু userinputসত্যবাদী (একটি সংখ্যা), তাই আমি +5এটিতে যুক্ত করতে পারি
  • "সত্যবাদী" এর অর্থ হল অভিব্যক্তিটিকে সত্য হিসাবে মূল্যায়ন করা যায়। সত্যবাদী এবং মিথ্যা এক্সপ্রেশনগুলির একটি তালিকা এখানে ।

সুতরাং এখানে আমরা অপারেটরের সাধারণ ব্যবহারের সাথে অতিরিক্ত ifব্লক এবং আরও isNaNচেক এড়াতে সক্ষম হয়েছি &&


এটি কীভাবে কাজ করে:

এখন অবধি, আমাদের কমপক্ষে একটি ছবি থাকা উচিত কীভাবে অপারেটরদের কাজ। সর্বজনীন নিয়ম যায়:

  • (some falsy expression) && expr মিথ্যা অভিব্যক্তি মূল্যায়ন করবে
  • (some truthy expression) || expr সত্যবাদী অভিব্যক্তি মূল্যায়ন করবে

আরও ভাল বোঝার জন্য এখানে আরও কয়েকটি উদাহরণ দেওয়া হয়েছে:

function a() { console.log('a'); return false; }
function b() { console.log('b'); return true; }

if ( a() && b() ){
     console.log('foobar'); 
}

//Evaluates a() as false, stops execution.

function a() { console.log('a'); return false; }
function b() { console.log('b'); return true; }

if ( a() || b() ){
     console.log('foobar'); 
}

/* 1. Evaluates a() as false
   2. So it should execute expr2, which is `b()`
   3. b() returned as true, executing statement `console.log('foobar');`
*/


একটি শেষ সমস্যাযুক্ত, তবে খুব গুরুত্বপূর্ণ বিষয় [অপারেটর অগ্রাধিকার]:

ভাল লাগল, আশা করছি আপনি এর ঝুলন্ত পেয়ে যাবেন! শেষ কথাটি আমাদের জানতে হবে অপারেটর অগ্রাধিকার সম্পর্কে একটি নিয়ম, তা হ'ল:

  • &&অপারেটর সবসময় পূর্বে কার্যকর ||অপারেটর।

নিম্নলিখিত উদাহরণ বিবেচনা করুন:

function a() { console.log('a'); return true;}
function b() { console.log('b'); return false;}
function c() { console.log('c'); return false;}

console.log(a() || b() && c());

// returns a() and stops execution

এটি সম্ভবত কিছু হিসাবে বিভ্রান্তিকরভাবে ফিরে আসবে a()। কারণটি বেশ সহজ, এটি আমাদের দৃষ্টি-দৃষ্টিকোণ যা আমাদের ধোকা দেওয়ার মতো, কারণ আমরা বাম থেকে ডানদিকে পড়তে অভ্যস্ত। আসুন কী console.log()এবং কী আউট নয় এবং নিখুঁতভাবে মূল্যায়নের দিকে ফোকাস করি

true || false && false

এখন এই সম্পর্কে আপনার মাথা মোড়ানো:

  1. আমরা বলেছিলাম যে &&অপারেটরের প্রাধান্য রয়েছে, তাই এটি প্রথম হিসাবে মূল্যায়ন হয়। আমাদের মূল্যায়নের আরও ভাল ধারণা করতে, সংজ্ঞাটি ভাবেন

    expr1 && expr2
    

    কোথায়:

    • expr2 হয় false
    • expr1 হয় true || false
  2. সুতরাং এটি ছিল জটিল অংশ, এখন true || falseমূল্যায়ন করা হয় (এর expr1- বাম দিকে &&)।

    • প্রদত্ত ||অপারেটর সঞ্চালনের স্টপ যদি expr1 || expr2expr1truthy যেমন মূল্যায়ণ, expr1মৃত্যুদন্ড কার্যকর করা হয় এবং কোড এক্সিকিউশন স্টপ।
  3. প্রত্যাশিত মান true

ঠিক আছে .. বেশ অদ্ভুত নিয়ম এবং শব্দার্থবিজ্ঞানের কারণে এটি বেশ জটিল ছিল। তবে মনে রাখবেন, আপনি গণিতের মতো() - এর সাথে সর্বদা অপারেটর প্রাধান্য থেকে রক্ষা পেতে পারেন

function a() { console.log('a'); return true;}
function b() { console.log('b'); return false;}
function c() { console.log('c'); return false;}

console.log((a() || b()) && c());

/* 1. The () escape && operator precedence
   2. a() is evaluated as false, so expr2 (c()) to be executed
   3. c()  
*/


আমি 1) "সংকলক" শব্দটি ব্যবহার করব না। "ইঞ্জিন" আরও সঠিক। 2) expr1এবং expr2 বা condition1বা যে কোনও বিষয়ে কথা বলবেন না , এটি কেবল বিভ্রান্তিকর। একটির জন্য সিদ্ধান্ত নিন, আপনি স্থানীয় ভেরিয়েবলগুলিও প্রবর্তন করতে পারেন, যেমন। const expr1 = true; if(expr1 && ...)
জোনাস উইলস

@ জোনাস উইলমস ইনপুট দেওয়ার জন্য ধন্যবাদ, সেই অনুসারে উত্তরটি সংশোধন করেছেন।
স্যামুয়েল হুল্লা

4
এটি এখনও জিজ্ঞাসিত প্রশ্নের সরাসরি উত্তর দেয় না।
কেভিন বি

7
এটিই হ'ল সেরা "দুর্দান্ত উত্তর যা স্পষ্টভাবে প্রশ্নের উত্তর দেয় না" যা আমি কখনও দেখেছি ...
জেরার্ডো ফুর্তাদো

4
এটি একটি গভীর ব্যাখ্যার সাথে সঠিক উত্তর, গ্রহণযোগ্য হিসাবে চিহ্নিত করা উচিত এবং এটি বর্তমানে যত বেশি তার চেয়ে বেশি পরিমাণে উত্সাহিত করা উচিত!
আলেকজান্ডার কিম
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.