2010-06-17 11 views
5

क्यों किसी तरहइस अभिव्यक्ति का अर्थ क्या है "!!"

if(!!window.JSON) alert('exists'); 
बजाय

सिर्फ

if(window.JSON) alert('exists'); 

एक अभिव्यक्ति का प्रयोग करेंगे?

क्या "!!" के लिए कोई और उपयोग है चीज़ ?

+0

एकाधिक नकारात्मक को समझने के लिए, हालांकि कर रहे हैं के लिए, इसका कारण यही है। यदि आप अपने कोड में (!! (!!) !!! (!) !! obj) का उपयोग करते रहें, तो केवल आप इसे बनाए रख सकते हैं (यदि आपका भाग्यशाली) - मैं कोई अनावश्यक नहीं हूं! – simendsjo

+1

http: // stackoverflow देखें।कॉम/प्रश्न/1406604/क्या-ऑपरेटर-डबल-विस्मयादिबोधक-बिंदु-माध्य-इन-जावास्क्रिप्ट/140776 9 # 140776 9; और आप सही हैं, इस मामले में यह अनावश्यक है, क्योंकि 'if()' पहले से ही बूलियन – Christoph

उत्तर

1

! एक तार्किक अस्वीकृति है, !! तार्किक अस्वीकृति दो बार लागू होती है, यानी तार्किक पहचान

मैं मानता हूं कि जो कोड आप पढ़ रहे हैं वह केवल हानिकारक रूप से (भ्रामक रूप से) अनावश्यक है।

+0

हाँ में परिवर्तित हो जाता है, लेकिन क्या सवाल में ऑब्जेक्ट से बूलियन तक एक अंतर्निहित प्रकार-कास्ट शामिल नहीं है? –

15

!! बस एक बूलियन रूपांतरण का कारण होगा, यह आवश्यक सब पर इस if बयान के साथ निर्माण अपनी पहली झलकी में भी, एक वस्तु बूलियन के लिए कोई मतलब नहीं है परिवर्तित करने का उपयोग करने के नहीं है, यह हमेशा सच हो जाएगा

केवल मानों false लिए मजबूर कर सकते हैं null, undefined, NaN, 0, और रिक्त स्ट्रिंग हैं और निश्चित रूप से किसी और false कुछ भी true को विवश होगा।

जब यह भावना !! उपयोग करने के लिए बनाता है जब आप जब तार्किक && और || ऑपरेटर्स का उपयोग कर उदाहरण के लिए, एक बूलियन परिणाम प्राप्त करने के सुनिश्चित करना चाहते हैं।

उन ऑपरेटरों एक संकार्य के मूल्य लौट सकते हैं, और कोई बूलियन परिणाम, उदाहरण के लिए:

true && "foo"; // "foo" 
"foo" || "bar" ; // "foo" 

कल्पना कीजिए कि आप एक समारोह है कि परीक्षण दो मूल्यों है, और आप एक बूलियन परिणाम की उम्मीद:

function isFoo() { 
    return 0 && true; 
} 

isFoo(); // returns 0, here it makes sense to use !! 

संपादित करें: अपने संपादित को देखते हुए, if (!!window.JSON) सिर्फ अनावश्यक रूप में मैं पहले भी कहा है, क्योंकि if statement अपने आप में wil एल बूलियन रूपांतरण internally बनाते हैं जब स्थिति अभिव्यक्ति का मूल्यांकन किया जाता है।

+0

ऐसा लगता है कि आप 'function isFoo (obj) {return obj और & true;} isFoo (0); 'अंतिम उदाहरण में :) या' वापसी !! obj और & true; ' – Znarkus

+0

' false && "foo" ' * झूठी * का मूल्यांकन करता है। – Gumbo

+0

@ गम्बो: हाँ, एक टाइपो एस/झूठा/सच था, @ जेनर्कस, हाँ, एक्सपोज़िटरी उद्देश्यों के लिए बस कुछ;) धन्यवाद दोस्तों ... – CMS

2

वे शायद ऑब्जेक्ट को बूलियन में डालने की कोशिश कर रहे हैं। ऑब्जेक्ट में एक बुलियन ऑपरेटर (!) लागू करके, यह एक बूल बन जाता है, लेकिन वे वास्तव में अस्वीकृति नहीं चाहते हैं, इसलिए वे पहले को रद्द करने के लिए दूसरा स्थान लागू करते हैं।

2
// !! = boolean typecasting in javascript 

var one = 1 
var two = 2; 

if (one==true) app.alert("one==true"); 
if (!!one==true) app.alert("!!one==true"); 

if (two==true) app.alert("two==true"); // won't produce any output 
if (!!two==true) app.alert("!!two==true"); 
+0

यही कारण है कि आपको '===' का उपयोग करना चाहिए और स्पष्ट रूप से डालना चाहिए:' = 'प्रकार रूपांतरण नियम एक डब्ल्यूटीएफ के कुछ हैं – Christoph

1

यह एक बुलियन रूपांतरण है, जो पहली बार बूलियन में रूपांतरण सुनिश्चित करता है और फिर मूल मूल्य पर वापस आ रहा है।

हालांकि इसे गलत तरीके से यहां इस्तेमाल किया जाता है और केवल वास्तव में प्रासंगिक होगा यदि आप किसी अन्य चर को असाइन - प्रदर्शन के कारणों के

var isJSON = (!!window.JSON); 

if (isJSON) doX; 
if (isJSON) doY; 
if (isJSON) doZ; 
संबंधित मुद्दे