2011-09-19 8 views
5

मैं इस विषय पर सह-कार्यकर्ता के साथ लगभग एक सप्ताह तक बहस कर रहा हूं। मैं जहां भी कर सकता हूं, ternaries, आदि का उपयोग कर, shorthand कोड का एक प्रशंसक हूँ। हाल ही में, वह मेरे बारे में डबल विस्मयादिबोधक के उपयोग के बारे में उठा रहा है। कई परीक्षण चलाने के बाद, मैं उनके साथ सहमत होना शुरू कर रहा हूं ... मेरे कोड में उपयोग करने के लिए डबल विस्मयादिबोधक बुद्धिमान नहीं हो सकता है। इस पर विचार करें:जेएस डबल विस्मयादिबोधक - क्या इसका उपयोग करने का कोई अच्छा कारण है?

var myvar = "Hello"; 
return (!!myvar ? "Var is set" : "Var is not set"); 

उपरोक्त उदाहरण अपेक्षा के अनुसार काम करता है। हालांकि, अगर हम एक वेरिएबल के खिलाफ जांच कर रहे हैं जो अपरिभाषित हो सकता है, तो हमें एक त्रुटि मिलती है, खासकर आईई 7 में। हम अपने अपेक्षित परिणाम मिलता है, लेकिन, अगर हम अपने कंसोल में इस चलाएँ:

if(randomvar) alert('Works'); 

इस दृष्टिकोण का उपयोग करना, यदि चर अपरिभाषित है, यह चुपचाप विफल रहता है। इससे मुझे डबल विस्मयादिबोधक के उपयोग पर सवाल उठता है। क्या ऐसी कोई परिस्थिति है जो वास्तव में इस ऑपरेटर को फायदेमंद बनाती है?

उत्तर

5

!!x एक बूलियन को x coerces, गुण x == !!x और typeof !!x === "boolean" साथ। (यदि आप valueOf ओवरराइड करते हैं तो सामान्य में सच नहीं हो सकता है, लेकिन मैं इस समय इसके बारे में सोचना नहीं चाहता हूं।)

9

जावास्क्रिप्ट में !! के लिए वैध उपयोग है। यह एक अभिव्यक्ति है जो एक मूल्य लेती है और बूलियन true या false में परिवर्तित होती है। यह अनिवार्य रूप से वर्तमान राज्य को एक बुलियन में जोड़ता है।

यह दोनों

  1. मूल्य
  2. संग्रह के लिए मूल वस्तु को मुक्त की truthiness कैप्चरिंग (कि अंतिम संदर्भ होना चाहिए)
  3. एक वस्तु की जो बाद में गलत प्रयोग रोकने में मदद करता के लिए अच्छा है समेकन समानता के साथ (==)। उन सभी को रोका नहीं है लेकिन इसे एक बूल पर मजबूर करना परिदृश्यों का एक सेट हटा देता है।
+0

की महान स्पष्टीकरण (! वोट दें शब्द "truthiness" प्रयोग करने के लिए), यह भी ध्यान देने योग्य है का उपयोग करना चाहते है कि आप इस तरह इस ऑपरेटर का उपयोग होता है: 'वापसी !! (window.Object && (obj1.function1 || obj.2function2));' यह सभी चीजों पर "रूपांतरण को मजबूर" करता है। convertallthethings.jpeg –

0

तो, मैं समझता हूँ कि typeof !!x === "boolean" और इसके पीछे तर्क (!x उल्टे बूलियन के रूप में डाले, !!x, उलट वापस आदि), लेकिन अगर यह स्वभाव से समस्याग्रस्त है मैं सोच रहा हूँ? यदि आप एक अपरिभाषित चर डाला है, तो आप अपने हाथों पर एक स्क्रिप्ट त्रुटि के साथ समाप्त होता है। मुझे उम्मीद है कि !!x == false यदि typeof !!x === "undefined" है, लेकिन ऐसा नहीं है। ऐसा लगता है कि यह सुरक्षित विकल्प होगा:

if((typeof x != "undefined") && (x != null)) { ... } 

किसी एक परिदृश्य में जहाँ का उपयोग कर !!x अधिक उपयुक्त है प्रदान कर सकते हैं? फिलहाल, मुझे इसका उपयोग करने का लाभ नहीं दिख रहा है।

मेरे सिर scratching ...

1

मैं IE में परीक्षण किया - !!undefined रिटर्न झूठी। जो मैं एक सही व्यवहार पर विश्वास करता हूं।

जहां !! उपयोगी (या हो सकता है) उपयोगी है।हालांकि यह आम तौर पर स्वीकार किया जाता है 1 यह है कि - test(1) अलर्ट विंडो पॉपअप नहीं होगा:

मान लीजिए आप एक समारोह है कि एक पैरामीटर स्वीकार करता है:

function test(param) { if (param === true) { alert('OK'); } }

के साथ कॉलिंग

यहाँ एक उदाहरण है true या true -ish मूल्य। हां कोई तर्क दे सकता है कि यह टीम में समझौते पर निर्भर है और प्रत्येक डेवलपर ज़िम्मेदारी सही डेटा प्रकार को पारित करने के लिए है - लेकिन जावास्क्रिप्ट में सही डेटा प्रकार क्या है? खासकर जब आपके पास यह सत्यापित करने के लिए एक कंपाइलर नहीं है कि कौन सा है।

इस प्रकार ऊपर स्थिति में, मैं if (!!param) बजाय if (param === true)

+0

'!! param' और 'param === true' समान नहीं हैं; '!! param' प्रत्येक" झूठी "मान, 'झूठी', 'अपरिभाषित', 'NaN') के लिए' झूठी 'वापस कर देगा, जबकि' param === true' केवल 'सत्य' वापस कर देगा यदि 'param' है बुलियन प्रकार, और 'सच' पर सेट है। जैसा कि आपने कहा था, अगर टीम सहमत है कि प्रकार बूलियन होना चाहिए, तो इसे अन्य प्रकारों को पास न करें। मैं व्यक्तिगत रूप से कार्यों में गुजरते समय उनके प्रकार से संबंधित पैरामीटर नामकरण के सम्मेलन का उपयोग करता हूं, अगर इसे एक अनुस्मारक के रूप में सख्त प्रकार की आवश्यकता होती है। 'फंक्शन चॉकलेटस्टारफिश (xInt, yBool) {// stuff}; 'आदि की तरह –

संबंधित मुद्दे