ফাংশন সহ জাভাস্ক্রিপ্ট টার্নারি অপারেটর উদাহরণ


91

আমি jQuery 1.7.1 ব্যবহার করছি

আমি জাভাস্ক্রিপ্ট টেরিনারি অপারেটরটি সহজ / অন্য বিবৃতিগুলিকে সহজ প্রতিস্থাপন করতে ব্যবহার শুরু করছি। আমি বেশ কয়েকটি জায়গায় সফলতার সাথে এটি করেছি। আমি অবাক হয়েছি যখন আমি সফলভাবে অন্য কিছু কাজ করেছি যখন আমি নিশ্চিত হয়েছিলাম যে এটি হবে না তবে আমি যাইহোক চেষ্টা করেছি।

এখানে মূল বক্তব্য:

function updateItem() {
    $this = $(this);
    var IsChecked = $this.hasClass("IsChecked");
    if (IsChecked == true){
        removeItem($this);
    } else {
        addItem($this);
    }
}

এখানে টার্নারি অপারেটর ব্যবহার করে একই ফাংশন:

function updateItem() {
    $this = $(this);
    var IsChecked = $this.hasClass("IsChecked");
    (IsChecked == true) ? removeItem($this) : addItem($this);
}

আমি অবাক হয়েছি কারণ যে উদাহরণগুলি আমি ব্যবহার করতে দেখেছি সেগুলির মধ্যে কেবলমাত্র এইরকম ভেরিয়েবল সেট করা ছিল:

x = (1 < 2) ? true : false;

আমার প্রশ্ন হ'ল এটি কি "সাধারণ" ব্যবহার এবং এটি জাভাস্ক্রিপ্টের বেশিরভাগ সংস্করণে কাজ করবে? কোথায় ব্যর্থ হবে? এর জন্য আরও কম সুস্পষ্ট ব্যবহার রয়েছে কি?

আপডেট - "বাস্তব বিশ্বের" পরামর্শের জন্য ধন্যবাদ !!!

আমি এটি আমার ফাংশন হিসাবে ব্যবহার করছি:

function updateItem() {
    $this = $(this);
    $this.hasClass("IsChecked") ? removeItem($this) : addItem($this);
}

এটি স্বাভাবিক এবং এটি ঠিক কাজ করবে .. সাধারণভাবে, টের্নারি অপারেটরগুলি ব্যবহার করার সময় পঠনযোগ্যতা শক্ত তবে আপনার ক্ষেত্রে এটি দেখতে ঠিক ঠিক দেখা যায় looks
সেলভাকুমার আরুমুগাম

4
হুম .... আপনি উভয়ই একই যুক্তি গ্রহণ করার কারণে আপনি এটি করতেও পারেন (IsChecked ? removeItem : addItem)($this)। তবে, আপনার প্রশ্নের উত্তর দেওয়ার জন্য, হ্যাঁ এটি স্বাভাবিক এবং ত্রিনিরি অপারেটররা যতক্ষণ না প্রয়োজন এমন অবস্থাতেই রক্ষণাবেক্ষণযোগ্যতা বা পঠনযোগ্যতা থেকে বিরত থাকেন না ততক্ষণ তাদের ব্যবহার করার ক্ষেত্রে কোনও ভুল নেই। jsfiddle.net/vsB3f
কেভিন বি

if($this.hasClass("IsChecked")) removeItem($this); else addItem($this)সঠিক উপায়। টেরিনারি অপারেটর এরকম ক্ষেত্রে নয় তবে যেমন foo(isChecked ? 'bar' : meow());(যেমন আপনি তখন / অন্য ব্লকগুলিতে যা কিছু করেন তার "রিটার্ন মান" সম্পর্কে
যত্নশীল হন

4
আপনার উদাহরণস্বরূপ, $(this).hasClass("IsChecked") ? removeItem($this) : addItem($this); এটির পক্ষে প্রথম লাইনটি এড়িয়ে যান: আমি আপনার কোডটি এক লাইনের মতোই বুঝতে পারি, সুতরাং এটি আমার থাম্বের নিয়মের সাথে খাপ খায় (নীচের পোস্টটি দেখুন)। আমার জন্য কাজ কর.
পরাবাস্তব স্বপ্নগুলি 21

উত্তর:


190

হেই, আপনার প্রশ্নে টের্নারি সিনট্যাক্সের বেশ কিছু চমকপ্রদ ব্যবহার রয়েছে; আমি সর্বশেষ সেরা পছন্দ করি ...

x = (1 < 2) ? true : false;

এখানে টার্নারি ব্যবহার সম্পূর্ণ অপ্রয়োজনীয় - আপনি কেবল লিখতে পারেন

x = (1 < 2);

তেমনি, একটি ত্রৈমাসিক বিবৃতিটির শর্ত উপাদানটি সর্বদা বুলিয়ান মান হিসাবে মূল্যায়ন করা হয় এবং তাই আপনি প্রকাশ করতে পারেন:

(IsChecked == true) ? removeItem($this) : addItem($this);

কেবল হিসাবে:

(IsChecked) ? removeItem($this) : addItem($this);

আসলে, আমি IsCheckedঅস্থায়ী এছাড়াও অপসারণ করব যা আপনাকে ছেড়ে দেয়:

($this.hasClass("IsChecked")) ? removeItem($this) : addItem($this);

এটি গ্রহণযোগ্য বাক্য গঠন কিনা তা নিশ্চিত! পঠনযোগ্যতার কোনও ক্ষতি না করে একের মধ্যে কোডের চারটি লাইন হ্রাস করার দুর্দান্ত উপায়। আমি আপনাকে যে পরামর্শ দেওয়ার পরামর্শ দিচ্ছি তা হ'ল একই লাইনে একাধিক ত্রৈমাসিক বিবৃতি বাসা এড়ানো (এইভাবে পাগলামি মিথ্যা!)


নোট তুমি ক্লাসে নামে উপরের ক্ষেত্রে ব্যবহার (IsChecked হয়ে উঠছে না পরীক্ষা) এড়াতে চান করতে পারে যে stackoverflow.com/questions/1547986/...
Adrien হউন

($this.hasClass("isChecked") ? removeItem : addItem)($this)
জেএসের

22

তিনারারি স্টাইলটি সাধারণত স্থান বাঁচাতে ব্যবহৃত হয়। শব্দার্থকভাবে, তারা অভিন্ন। আমি যদি পুরোপুরি / তবে / অন্য বাক্য বিন্যাস করতে পারি তবে আমি পাঠযোগ্যতার ত্যাগ করতে পছন্দ করি না - আমি পুরানো-স্কুল এবং আমি আমার বন্ধনীগুলি পছন্দ করি prefer

সম্পূর্ণ যদি / তবে / অন্য বিন্যাসটি বেশ কিছু কিছুর জন্য ব্যবহৃত হয়। এটি বিশেষত জনপ্রিয় যদি আপনি প্রতিটি শাখায় কোডের বৃহত্তর ব্লকগুলিতে প্রবেশ করেন, আপনার / অন্য গাছ, বা একটি দীর্ঘ স্ট্রিংয়ে একাধিক অন্য / আইএফ থাকলে একটি মুটি শাখা রয়েছে।

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

চমৎকার চিন্তা:

this > that ? alert(this) : alert(that);  //nice and short, little loss of meaning

if(expression)  //longer blocks but organized and can be grasped by humans
{
    //35 lines of code here
}
else if (something_else)
{
    //40 more lines here
}
else if (another_one)  /etc, etc
{
    ...

কম ভাল:

this > that ? testFucntion() ? thirdFunction() ? imlost() : whathappuh() : lostinsyntax() : thisisprobablybrokennow() ? //I'm lost in my own (awful) example by now.
//Not complete... or for average humans to read.

if(this != that)  //Ternary would be done by now
{
    x = this;
}
else
}
    x = this + 2;
}

থাম্বের একটি সত্যিকারের মূল নিয়ম - আপনি কি পুরো বিষয়টি বুঝতে পারবেন বা একটি লাইনে আরও ভাল? টার্নারি ঠিক আছে। অন্যথায় এটি প্রসারিত করুন।


8

আমি আমার কাছ থেকে কিছু যুক্ত করতে চাই।

টার্নারি অপারেটরের সাথে ফাংশনগুলিতে কল করার অন্যান্য সম্ভাব্য বাক্য বাক্যগুলি হ'ল:

(condition ? fn1 : fn2)();

যদি আপনার উভয় ফাংশনে প্যারামিটারগুলির একই তালিকাটি পাস করতে হয় তবে এটি কার্যকর হতে পারে, সুতরাং আপনাকে কেবল একবার লিখতে হবে।

(condition ? fn1 : fn2)(arg1, arg2, arg3, arg4, arg5);

আপনি সদস্য ফাংশন নামগুলির সাথেও টার্নারি অপারেটরটি ব্যবহার করতে পারেন, যা আমি ব্যক্তিগতভাবে স্থান বাঁচাতে খুব পছন্দ করি:

$('.some-element')[showThisElement ? 'addClass' : 'removeClass']('visible');

বা

$('.some-element')[(showThisElement ? 'add' : 'remove') + 'Class']('visible');

আরেকটি উদাহরণ:

var addToEnd = true; //or false
var list = [1,2,3,4];
list[addToEnd ? 'push' : 'unshift'](5);

7

আপনি যে উদাহরণটি পোস্ট করেছেন সে সম্পর্কে বিশেষ কৌতুকপূর্ণ কিছুই নেই।

একটি ত্রিনিরি অপারেটরে, প্রথম যুক্তি (শর্তসাপেক্ষ) মূল্যায়ন করা হয় এবং ফলাফলটি trueহলে দ্বিতীয় যুক্তিটি মূল্যায়ন করে ফিরে আসে, অন্যথায় তৃতীয়টি মূল্যায়ন করে ফিরে আসে returned এই আর্গুমেন্টগুলির প্রত্যেকটিই ফাংশন কল সহ যে কোনও বৈধ কোড ব্লক হতে পারে।

এই ভাবে চিন্তা করুন:

var x = (1 < 2) ? true : false;

এই হিসাবে লেখা যেতে পারে:

var x = (1 < 2) ? getTrueValue() : getFalseValue();

এটি পুরোপুরি বৈধ এবং এই ফাংশনগুলিতে কোনও স্বেচ্ছাসেবীর কোড থাকতে পারে, এটি কোনও মূল্য ফেরত দেওয়ার সাথে সম্পর্কিত কিনা। অতিরিক্তভাবে, ত্রৈমাসিক ক্রিয়াকলাপের ফলাফলগুলিকে কোনও কিছুর জন্য বরাদ্দ করতে হবে না, ঠিক যেমন ফাংশন ফলাফলকে কোনও কিছুতে বরাদ্দ করতে হয় না:

(1 < 2) ? getTrueValue() : getFalseValue();

এখন যেকোন যথেচ্ছ কার্যাবলী সহ কেবল তাদের প্রতিস্থাপন করুন এবং আপনার উদাহরণের মতো কিছু রয়েছে:

(1 < 2) ? removeItem($this) : addItem($this);

এখন আপনার শেষ উদাহরণটির জন্য আসলে কোনও দ্বিখণ্ডার প্রয়োজন নেই, কারণ এটি এভাবে লেখা যেতে পারে:

x = (1 < 2);  // x will be set to "true"

6

আপনি যদি বাসা টের্নারি অপারেটরদের কাছে যাচ্ছেন তবে আমি বিশ্বাস করি আপনি এই জাতীয় কিছু করতে চাইবেন:

   var audience = (countrycode == 'eu') ? 'audienceEU' :
                  (countrycode == 'jp') ? 'audienceJP' :
                  (countrycode == 'cn') ? 'audienceCN' :
                  'audienceUS';

এটি লেখার / পড়ার চেয়ে অনেক বেশি দক্ষ:

var audience = 'audienceUS';
if countrycode == 'eu' {
   audience = 'audienceEU';
} else if countrycode == 'jp' {
   audience = 'audienceJP';
} else if countrycode == 'cn' {
   audience = 'audienceCN';
}

সমস্ত ভাল প্রোগ্রামিংয়ের মতোই হোয়াইটস্পেস আপনার প্রকল্পটি শেষ করার পরে আপনার কোডটি পড়তে হবে এমন লোকদের জন্য সবকিছুকে সুন্দর করে তোলে।


6
নেস্টেড টার্নারি পড়তে এবং ডিবাগ করা সহজ হওয়া সম্পর্কে আপনার উপরের মন্তব্যের সাথে দৃ disag়ভাবে একমত নন। ব্যক্তিগতভাবে, আমি বরং নেস্টেড অন্যটি / যদি ব্লকটি প্রতিস্থাপনের টেবিল বা একটি স্যুইচ বিবৃতি দিয়ে প্রতিস্থাপন করে দেখি ।
জনিরিভেস

@ জনিআরিভস সম্মত হয়েছেন - বিভিন্ন অবস্থার (যেমন সংখ্যার মডুলো ) পরীক্ষা করার সময় সাধারণত নেস্টেড টেরিনারি সিনট্যাক্সটি সবচেয়ে ভাল ব্যবহার করা হয়
অ্যালেক্সফক্সগিল

2

আমি জানি প্রশ্নের ইতিমধ্যে উত্তর দেওয়া হয়েছে।

তবে আমাকে এখানে একটি পয়েন্ট যোগ করুন। এটি কেবল সত্য বা মিথ্যা ক্ষেত্রেই নয়। নিচে দেখ:

var val="Do";

Var c= (val == "Do" || val == "Done")
          ? 7
          : 0

এখানে যদি ভল ডো বা ডোন হয় তবে সি হবে 7 হবে অন্যটি শূন্য হবে। এক্ষেত্রে গ হবে।।

এটি প্রকৃতপক্ষে এই অপারেটরের অন্য দৃষ্টিভঙ্গি।

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