जावास्क्रिप्ट में "बिना"


149

मुझे हमेशा nullअन्य शर्तों में रखना पड़ता है जिसमें कुछ भी नहीं होता है। क्या इसके आसपास भी ऐसा है? उदाहरण के लिए

condition ? x = true : null;

मूल रूप से, ऐसा करने का एक तरीका है:

condition ? x = true;

अब यह सिंटैक्स त्रुटि के रूप में दिखाई देता है

FYI करें, यहाँ कुछ वास्तविक उदाहरण कोड है:

!defaults.slideshowWidth ? defaults.slideshowWidth = obj.find('img').width()+'px' : null;

21
जैसे टर्नरी का उपयोग condition ? x = true : null;संभवतः लिखा जाना चाहिए x = (condition ? true : null);। एक तरफ के रूप में, जावास्क्रिप्ट nullमें इस तरह के झूठे का मूल्यांकन करता है ताकि आप x = (condition);उसी परिणाम को प्राप्त कर सकें ।
मैट एस

1
मैट, आपका उत्तर सबसे अच्छा है, लेकिन यह एक उत्तर नहीं है, यह एक टिप्पणी है!
चेइसो

मैट, मेरा वास्तविक कोड है:! Defaults.slideshowWidth! defaults.slideshowWidth = obj.find ('img')। चौड़ाई () + 'px': null; एक छोटा, बेहतर तरीका है कि लिखने के लिए?
ऑस्कर गोडसन

2
defaults.slideshowWidth = defaults.slideshowWidth || obj.find ('img')। चौड़ाई () + 'px';
केनेबेक

पहचान असाइनमेंट से बचने के लिए बेहतर होगा, इसलिए यह सिर्फ एक शर्त होनी चाहिए:if (!defaults.slideshowWidth) defaults.slideshowWidth = obj.find('img').width()+'px'
Mihail Malostanidis

जवाबों:


226

सबसे पहले, एक ternary अभिव्यक्ति एक if / else निर्माण के लिए एक प्रतिस्थापन नहीं है - इसका एक if / if निर्माण के बराबर है जो मान लौटाता है। यही है, यदि एक / और क्लॉज कोड है, एक टर्नरी अभिव्यक्ति एक अभिव्यक्ति है , जिसका अर्थ है कि यह एक मूल्य लौटाता है।

इसका मतलब है कई चीजें:

  • जब आपके पास बाईं ओर एक चर है, तो टर्नरी अभिव्यक्तियों का उपयोग करें, जो =कि रिटर्न मान को सौंपा जाना है
  • केवल लौकिक भावों का उपयोग करें जब लौटा हुआ मूल्य दो मानों में से एक हो (या फिटिंग हो तो नेस्टेड अभिव्यक्तियों का उपयोग करें)
  • अभिव्यक्ति के प्रत्येक भाग (बाद में और बाद में) को साइड इफेक्ट्स के बिना एक मान लौटना चाहिए (अभिव्यक्ति x = trueसही है क्योंकि सभी अभिव्यक्तियाँ अंतिम मान लौटाती हैं, लेकिन एक्स के बिना एक्स भी बदले हुए मूल्य पर कोई प्रभाव नहीं डालता है)

संक्षेप में - एक टर्नरी अभिव्यक्ति का 'सही' उपयोग है

var resultofexpression = conditionasboolean ? truepart: falsepart;

अपने उदाहरण के बजाय condition ? x=true : null ;, जहां आप मूल्य का निर्धारण करने के लिए एक टर्नरी अभिव्यक्ति का xउपयोग करते हैं, आप इसका उपयोग कर सकते हैं:

 condition && (x = true);

यह अभी भी एक अभिव्यक्ति है और इसलिए सत्यापन पारित नहीं हो सकता है, इसलिए एक बेहतर दृष्टिकोण होगा

 void(condition && x = true);

अंतिम सत्यापन पास होगा।

लेकिन फिर, यदि अपेक्षित मूल्य एक बूलियन है, तो केवल स्थिति अभिव्यक्ति के परिणाम का उपयोग करें

var x = (condition); // var x = (foo == "bar");

अद्यतन अपने नमूने के संबंध में यह संभवतः अधिक उपयुक्त है:

defaults.slideshowWidth = defaults.slideshowWidth || obj.find('img').width()+'px';

4
शानदार एसओ, i/elseटाइपो को सही करने की अनुमति नहीं देता क्योंकि यह पर्याप्त वर्ण नहीं है।
दीव

1
शून्य (स्थिति && x = true) - यह बहुत अच्छा लग रहा है, लेकिन "अमान्य असाइनमेंट लेफ्ट-हैंड साइड" त्रुटि को फेंकने लगता है
यूजीन ट्यूरिन

1
शून्य (स्थिति && (x = true)) // असाइनमेंट को पहले मान से अलग रखता है
हीरे

4
हालांकि, यह पढ़ने के लिए सहज नहीं है, विशेष रूप से डेवलपर्स के लिए इस शैली का उपयोग नहीं किया गया है। आप इसे आसानी से और अधिक आसानी से लिख सकते हैं जैसे: अगर (शर्त) {x = true; }
हीरे

2
क्या आप समझा सकते हैं कि "सत्यापन पारित नहीं हो सकता है" से आपका क्या मतलब है? मुझे समझ में नहीं आता कि किसी को अभिव्यक्ति को क्यों लपेटना चाहिए void()। धन्यवाद।
११

20

नहीं, इसके लिए तीन ऑपरेंड चाहिए। इसलिए वे टर्नरी ऑपरेटर कहलाते हैं ।

हालाँकि, आपके पास अपने उदाहरण के रूप में, आप ऐसा कर सकते हैं:

if(condition) x = true;

हालाँकि भविष्य में एक से अधिक कथन जोड़ने की आवश्यकता है, लेकिन यह ब्रेसिज़ के लिए सुरक्षित है:

if(condition) { x = true; }

संपादित करें: अब जब आप उस वास्तविक कोड का उल्लेख करते हैं जिसमें आपका प्रश्न इस पर लागू होता है:

if(!defaults.slideshowWidth)
    { defaults.slideshowWidth = obj.find('img').width()+'px'; }

1
आप कर सकते हैं, लेकिन आपको नहीं करना चाहिए। कम से कम इसके चारों ओर घुंघराले कोष्ठक के बिना नहीं - यह बहुत त्रुटिपूर्ण है।
कोनरक

1
क्या यह सच है? मुझे समझ में आने के लिए मुख्य कारण समझ में आया क्योंकि वे jslint के जीवन को आसान बनाते हैं।
चेसो

@ चेसो यह रिफैक्टिंग के अर्थ में त्रुटिपूर्ण है। तुम वापस आ जाओ बिना वास्तविक स्थिति के मामले में और अधिक जोड़ने के लिए वहाँ कोई घुंघराले ब्रेसिज़ नहीं है। नया कोड हमेशा सच होने की स्थिति के बजाय निष्पादित करेगा।
मैट एस

नहीं, मुझे पता है, मैं सिर्फ एक्स्ट्रा के बिना सशर्त लिखना पसंद करता हूं जैसे कि () {} और {} जब इसके बराबर बस:;
ऑस्कर गोडसन

3
ईमानदारी से, मैंने कभी नहीं जाना कि डेवलपर्स को जावास्क्रिप्ट की तुलना में भाषा का उपयोग करने से अधिक डर लगता है: -पी मुझे पसंद नहीं करता है कोई मुझे बता रहा है कि मुझे घुंघराले ब्रेसिज़ का उपयोग नहीं करना चाहिए। मैं उन्हें बहुत छोड़ देता हूं और कभी भी इससे ज्यादा परेशानी नहीं होती कि मैं गलती से एक कंस को याद करूं।
एंडी ई

12

अधिक बार लोगों को कथन सिंटैक्स को छोटा करने के लिए तार्किक ऑपरेटरों का उपयोग मिलता है:

!defaults.slideshowWidth &&
  (defaults.slideshowWidth = obj.find('img').width()+'px');

लेकिन आपके विशेष मामले में वाक्यविन्यास और भी सरल हो सकता है

defaults.slideshowWidth = defaults.slideshowWidth || obj.find('img').width()+'px';

यह कोड defaults.slideshowWidthमान लौटाएगा यदि defaults.slideshowWidthसत्य का मूल्यांकन किया जाए और obj.find('img').width()+'px'अन्यथा मूल्य।

विवरण के लिए तार्किक ऑपरेटरों के शॉर्ट-सर्किट मूल्यांकन को देखें।


11
var x = condition || null;

2
(defaults.slideshowWidth) || (defaults.slideshowWidth = obj.find('img').width()+'px')याdefaults.slideshowWidth = defaults.slideshowWidth || (obj.find('img').width()+'px')
केसी चू

> वापसी expr1 अगर यह सच में परिवर्तित किया जा सकता है; अन्यथा, expr2 देता है। लॉजिकल ऑपरेटर्स (एमडीएन)
स्ज़बोल्क्स पैल सेप

5

आप लिख सकते हैं

x = condition ? true : x;

तो यह है कि एक्स झूठे है जब हालत झूठी है।

यह तब के बराबर है

if (condition) x = true

संपादित करें:

!defaults.slideshowWidth 
      ? defaults.slideshowWidth = obj.find('img').width()+'px' 
      : null 

कुछ विकल्प हैं - मैं नहीं कह रहा हूं कि ये बेहतर / बदतर हैं - केवल विकल्प

शून्य में पासिंग तीसरा पैरामीटर काम करता है क्योंकि मौजूदा मान शून्य है। यदि आप रिफ्लेक्टर करते हैं और स्थिति बदलते हैं, तो एक खतरा है कि यह अब सच नहीं है। इस के खिलाफ टर्नरी गार्ड में दूसरी पसंद के रूप में एक्साइज मूल्य में पासिंग:

!defaults.slideshowWidth = 
      ? defaults.slideshowWidth = obj.find('img').width()+'px' 
      : defaults.slideshowwidth 

सुरक्षित है, लेकिन शायद देखने में उतना अच्छा नहीं है, और अधिक टाइपिंग है। व्यवहार में, मैं शायद लिखूंगा

defaults.slideshowWidth = defaults.slideshowWidth 
               || obj.find('img').width()+'px'

कुछ लाइव कोड है (इस में शून्य से छुटकारा पाने के लिए वैसे भी?):? Defaults.slideshowWidth defaults.slideshowWidth = obj.find ('img')। चौड़ाई () + 'px': null;
ऑस्कर गोडसन

2

आपके मामले में मैं सहायक ऑपरेटर को निरर्थक के रूप में देखता हूं। आप चर का उपयोग करते हुए सीधे अभिव्यक्ति को असाइन कर सकते हैं, && ऑपरेटर्स।

!defaults.slideshowWidth ? defaults.slideshowWidth = obj.find('img').width()+'px' : null ;

हो जाएगा :

defaults.slideshowWidth = defaults.slideshowWidth || obj.find('img').width()+'px';

यह अधिक स्पष्ट है, यह अधिक "जावास्क्रिप्ट" शैली है।


2

क्या बस के बारे में?

    if (condition) { code if condition = true };

1

किसी सरणी या ऑब्जेक्ट घोषणा के अंदर किसी अन्य के बिना टर्नेरी ऑपरेटर का उपयोग करने के लिए आप ES6 स्प्रेड ऑपरेटर का उपयोग कर सकते हैं ...()

const cond = false;
const arr = [
  ...(cond ? ['a'] : []),
  'b',
];
    // ['b']

और वस्तुओं के लिए:

const cond = false;
const obj = {
  ...(cond ? {a: 1} : {}),
  b: 2,
};
    // {b: 2}

मूल स्रोत

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