जावास्क्रिप्ट शॉर्टहैंड टर्नरी ऑपरेटर


102

मुझे पता है कि php 5.3 में इस निरर्थक टर्नरी ऑपरेटर सिंटैक्स का उपयोग करने के बजाय:

startingNum = startingNum ? startingNum : 1

... हम अपने टर्नरी ऑपरेटरों के लिए एक शॉर्टहैंड सिंटैक्स का उपयोग कर सकते हैं जहां लागू हो:

startingNum = startingNum ?: 1

और मुझे जावास्क्रिप्ट में टेनेरी ऑपरेटर के बारे में पता है:

startingNum = startingNum ? startingNum : 1

... लेकिन क्या कोई आशुलिपि है?

जवाबों:


176
var startingNumber = startingNumber || 1;

कुछ ऐसा है जो आप खोज रहे हैं, जहां यह अपरिभाषित है तो चूक?

var foo = bar || 1; // 1
var bar = 2;
foo = bar || 1;     // 2

वैसे, यह वस्तुओं सहित बहुत सारे परिदृश्यों के लिए काम करता है:

var foo = bar || {}; // secure an object is assigned when bar is absent

दरअसल, आज सुबह से उछल रहा था। फिक्स्ड, लेकिन ध्यान देने के लिए धन्यवाद।
ब्रैड क्रिस्टी

1
क्या आपको ||इसके बजाय मतलब नहीं है ???
रॉकेट हज़मत

2
धन्यवाद! आप इसे किसी न किसी। मैं वास्तव में इस उदाहरण में एक वस्तु का उपयोग कर रहा हूँ। :)
वेब_डिजाइनर

8
जिज्ञासु के लिए, यह काम करता है क्योंकि जेएस का ||ऑपरेटर सही या गलत नहीं लौटाता है, यह पहला 'सत्य' मान देता है। कहते हैं कि आपके पास val0और val1जैसा है undefined, और val2है 2, val3है 3val0 || val1 || val2 || val3वापस आ जाएगा 2, क्योंकि यह पहला 'सत्य' मूल्य है।
जेक टी।

2
क्या यह मुहावरा एक विरोधी पैटर्न नहीं है? क्या होगा यदि आप 0 या रिक्त स्ट्रिंग पास करते हैं, तो 'OR' अभिव्यक्ति इसे छोड़ देगी और डिफ़ॉल्ट मान का उपयोग करेगी जहाँ आप वास्तव में 0 या रिक्त स्ट्रिंग चाहते थे।
पॉल Trzyna

24

|| लौटेगा पहला सत्य मूल्य, यह सामना करता है, और इसलिए सी # एस के समान एक कोलेसिंग ऑपरेटर के रूप में इस्तेमाल किया जा सकता है ??

startingNum = startingNum || 1;

मुझे अन्य लोगों की तुलना में आपका स्पष्टीकरण अधिक पसंद है
ajax333221

12

हाँ वहाँ है:

var startingNum = startingNum || 1;

सामान्य तौर पर, expr1 || expr2निम्नलिखित तरीके से काम करता है (जैसा कि प्रलेखन द्वारा उल्लेख किया गया है ):

expr1अगर यह परिवर्तित किया जा सकता है तो लौटाता है true; अन्यथा, रिटर्न expr2इस प्रकार, जब Booleanमानों के साथ उपयोग किया जाता है, तो यदि ऑपरेंड है तो ||वापस आ trueजाता है true; अगर दोनों हैं false, तो रिटर्न false


क्या इसे if a is truthyबनाम कहना ज्यादा सही नहीं है if a is evaluated to true?
जेयरपावर

3
@JaredPar: अस्पष्टता से बचने के लिए, मैंने अपने मूल विस्तृत विवरण को मोज़िला डेवलपर नेटवर्क से बदल दिया है। यह कम अस्पष्ट होना चाहिए।
18

2
var startingNum = startingNum || 1;

इस स्थिति में, आप OR ऑपरेटर का उपयोग कर सकते हैं।


2
startingNum = startingNum || 1

यदि आपके पास अशक्त के साथ एक शर्त है, जैसे

startingNum = startingNum ? startingNum : null

आप उपयोग कर सकते हैं '&&'

startingNum = startingNum && startingNum

लेकिन anything && nullजब तक anythingझूठा नहीं होगा, तब तक मूल्यांकन नहीं करेंगे ?
पेट्रूजा

हाँ, अगर कुछ भी सत्य है तो यह अशक्त करने के लिए मूल्यांकन करता है। यदि इसका मिथ्या है, तो
मिथ्या

1

उपरोक्त उत्तर सही हैं। जावास्क्रिप्ट में, निम्नलिखित कथन:

startingNum = startingNum ? otherNum : 1

के रूप में व्यक्त किया जा सकता है

startingNum = otherNum || 1

यदि आप मिलान नहीं करते हैं तो एक और परिदृश्य यहां कवर नहीं किया गया है, यदि आप चाहते हैं कि मूल्य गलत वापस आए। इसके लिए जावास्क्रिप्ट शॉर्टहैंड है:

startingNum = startingNum ? otherNum : 0

लेकिन इसे व्यक्त किया जा सकता है

startingNum = startingNum && otherNum

यदि कोई अन्य सामान्यीकृत उत्तर की तलाश कर रहा हो तो बस दूसरे परिदृश्य को कवर करना चाहता था।


वहाँ कुछ इस तरह के लिए एक आशुलिपि है: x = innerWidth * 0.0375 > 24 ? innerWidth * 0.0375 : 24???
ओल्डबॉय

@ एंथनी नहीं, क्योंकि जो हिस्सा है उससे innerWidth * 0.0375 > 24अलग if trueहै innerWidth * 0.0375। यदि आशुलिपि केवल इस्तेमाल किया जा सकता expression to be evaluatedहै और if trueएक ही मूल्य है। वही क्यों आप शॉर्टहैंड करने में सक्षम नहीं होंगे x = someBoolean ? 'Heck yea!' : 'No way!'
डेबूब

@ डिडबब वेल, वास्तव में, एक "शॉर्टहैंड" है (यदि आप इसे कहते हैं) जो कि होगाMath.max(innerWidth * 0.0375, 24)
Oldboy

@ एंथनी आप इसे नहीं कहेंगे;) लेकिन Math.maxआपके उपयोग के मामले में एक टर्नरी ऑपरेटर से बेहतर काम करता है।
डीडूब

1
"के startingNum = startingNum ? otherNum : 1रूप में व्यक्त किया जा सकता है startingNum = otherNum || 1" गलत है। मैं सिर्फ यह परीक्षण किया
पुराने

0

एक टर्नरी बनाने के लिए जैसे:

boolean_condition ? true_result : false_result

जावास्क्रिप्ट में, आप कर सकते हैं:

(boolean_condition && true_result ) || false_result;

उदाहरण:

(true && 'green') || 'red';
=> "green"
(false && 'green') || 'red';
=> "red"

sooo x = innerWidth * 0.0375 > 24 ? innerWidth * 0.0375 : 24बन जाएगा (innerWidth * 0.0375 > 24 && innerWidth * 0.0375) || 24?? वहाँ एक आशुलिपि है, ताकि मैं दोहराना innerWidth * 0.0375करने के लिए एक चर को सौंपने के अलावा नहीं है ???
ओल्डबॉय

1
इस मामले में, Math.max( innerWidth * 0.0375 , 24 )शान से काम करेंगे। एक अधिक सामान्य मामले के लिए, एक वर्णनात्मक विधि बनाना अच्छा होगा, जैसे कि 'somethingifiedInnerWidth', जो एक चर बनाने के बजाय पठनीयता में सुधार करता है। यद्यपि कुछ मामलों में यह एक परिवर्तनशील (उस वर्णनात्मक नाम) के लिए अधिक पठनीय होगा, इसलिए भविष्य में यह सवाल 'क्यों यह इस से गुणा किया जाता है?' उठाया नहीं है।
xxjjnn

वाह, यहां तक ​​कि पता है कि यू के लिए एक 2 तर्क प्रदान कर सकता है Math.max। सुपर सुरुचिपूर्ण समाधान !!
ओल्डबॉय
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.