कार्यों के साथ जावास्क्रिप्ट टर्नरी ऑपरेटर उदाहरण


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);
}

यह सामान्य है और यह ठीक काम करेगा .. सामान्य तौर पर, टर्नरी ऑपरेटरों का उपयोग करते समय पठनीयता कठिन होती है लेकिन आपके मामले में यह ठीक लगता है।
सेल्वकुमार अरुमुगम

1
हम्म .... आप यह भी कर सकते हैं क्योंकि वे दोनों एक ही तर्क स्वीकार करते हैं (IsChecked ? removeItem : addItem)($this)। हालांकि, आपके प्रश्न का उत्तर देने के लिए, हाँ यह सामान्य है और जब तक कि उन्हें उस स्थिति में स्थिरता या पठनीयता से अलग नहीं किया जाता है, तब तक टर्नरी ऑपरेटरों का उपयोग करने में कुछ भी गलत नहीं है। jsfiddle.net/vsB3f
केविन बी

if($this.hasClass("IsChecked")) removeItem($this); else addItem($this)उचित तरीका है। टर्नेरी ऑपरेटर इस तरह के मामलों के लिए नहीं है, लेकिन चीजों के लिए है, जैसे कि foo(isChecked ? 'bar' : meow());(जब आप तत्कालीन / अन्य ब्लॉकों में जो भी करते हैं उसके "वापसी मूल्य" की परवाह करते हैं)
ThiefMaster

1
आपके उदाहरण में, इसके पक्ष में पहली पंक्ति छोड़ें: $(this).hasClass("IsChecked") ? removeItem($this) : addItem($this); मैं आपके कोड को समझ सकता हूं-एक पंक्ति में है, इसलिए यह मेरे अंगूठे के नियम को फिट करता है (नीचे पोस्ट देखें)। मेरे लिये कार्य करता है।
असली सपने

जवाबों:


189

हे, आपके प्रश्न में टर्नरी सिंटैक्स के कुछ बहुत ही रोमांचक उपयोग हैं; मुझे पिछले एक सबसे अच्छा लगता है ...

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 Be

जेएस के पास प्रथम श्रेणी के कार्य हैं:($this.hasClass("isChecked") ? removeItem : addItem)($this)
क्लोज्योरमोस्टली

22

अंतरिक्ष को बचाने के लिए आम तौर पर टर्नरी शैली का उपयोग किया जाता है। शब्दार्थ, वे समान हैं। मैं पूर्ण के साथ जाना पसंद करता हूँ अगर / फिर / अन्यथा सिंटैक्स क्योंकि मुझे पठनीयता का त्याग करना पसंद नहीं है - मैं पुराना स्कूल हूँ और मैं अपने ब्रेसिज़ पसंद करता हूँ।

पूर्ण / यदि / अन्यथा प्रारूप का उपयोग बहुत अधिक हर चीज के लिए किया जाता है। यह विशेष रूप से लोकप्रिय है यदि आप प्रत्येक शाखा में कोड के बड़े ब्लॉकों में आते हैं, तो आपके पास एक उत्परिवर्ती-ब्रांच्ड है यदि / और पेड़, या कई अन्य / एक लंबे स्ट्रिंग में।

जब आप एक साधारण स्थिति के आधार पर एक चर के लिए एक मूल्य प्रदान कर रहे हैं या आप बहुत ही संक्षिप्त परिणामों के साथ कई निर्णय ले रहे हैं तो टर्नरी ऑपरेटर आम है। आप जिस उदाहरण का हवाला देते हैं वह वास्तव में समझ में नहीं आता है, क्योंकि अभिव्यक्ति बिना किसी अतिरिक्त तर्क के दो मूल्यों में से एक का मूल्यांकन करेगी।

अच्छे विचार:

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;
}

एक वास्तव में बुनियादी अंगूठे का नियम - आप के रूप में अच्छी या एक पंक्ति में बेहतर पूरी बात को समझ सकता हूँ? टर्नरी ठीक है। अन्यथा इसका विस्तार करें।


7

आपके द्वारा पोस्ट किए गए उदाहरण के बारे में कुछ भी मुश्किल नहीं है।

एक टर्नरी ऑपरेटर में, पहले तर्क (सशर्त) का मूल्यांकन किया जाता है और यदि परिणाम होता है true, तो दूसरे तर्क का मूल्यांकन किया जाता है और वापस कर दिया जाता है, अन्यथा, तीसरे का मूल्यांकन किया जाता है और वापस लौटा दिया जाता है। उन तर्कों में से प्रत्येक फ़ंक्शन कोड सहित किसी भी मान्य कोड ब्लॉक हो सकते हैं।

इस पर इस तरीके से विचार करें:

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
नेस्टेड टर्नरी को पढ़ने और डिबग करने में आसान होने के बारे में आपकी उपरोक्त टिप्पणी से बहुत असहमत हैं। व्यक्तिगत रूप से, मैं इसके बजाय नेस्टेड को देखूंगा / यदि ब्लॉक को लुकअप टेबल या स्विच स्टेटमेंट के साथ बदल दिया जाए।
जॉनीरिव्स

@JonnyReeves सहमत - आमतौर पर नेस्टेड टर्नरी सिंटैक्स का उपयोग सबसे अच्छा होता है, जब विभिन्न स्थितियों (जैसे संख्याओं के मॉडुलो ) की जाँच करते हैं
एलेक्सफॉक्सगिल

6

मैं भी मुझसे कुछ जोड़ना चाहूंगा।

टर्नरी ऑपरेटर के साथ कॉल करने के लिए अन्य संभावित सिंटैक्स, होंगे:

(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);

2

मुझे पता है कि सवाल का जवाब पहले ही है।

लेकिन मैं यहां एक बिंदु जोड़ दूं। यह केवल सच या झूठ का मामला नहीं है। निचे देखो:

var val="Do";

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

यहाँ यदि वैल डू या डन है तो c 7 और होगा यह शून्य होगा। इस मामले में c 7 होगा।

यह वास्तव में इस ऑपरेटर का एक और दृष्टिकोण है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.