2013-09-02 8 views
5

मैं कुछ कोड के माध्यम से देख रहा हूँ कि किसी और लिखा है और मैं इस अजीब जावास्क्रिप्ट देखा अगर वाक्य रचना .. मूल रूप से, यह इस तरह दिखता है:जावास्क्रिप्ट - अजीब अगर वाक्य रचना

// This is understandable (but I dont know if it have relevance) 
var re = new RegExp("^" + someVar + "_", "i"); 

// !!~ ??? What is this black magic? 
if (!!~varA.search(re)) { ... } 

यह उन चीजों में से एक है कि गूगल करना मुश्किल है .. कोई भी जावास्क्रिप्ट गुरु जो इसे समझा सकता है?

+1

की [क्या है संभव डुप्लिकेट !!(नहीं) ऑपरेटर जावास्क्रिप्ट में?] (http://stackoverflow.com/questions/784929/what-is-the-not-not-operator-in-javascript) –

+1

संभावित डबल डुप्लिकेट [डबल विस्मयादिबोधक बिंदु?] (http : //stackoverflow.com/questions/9284664/double-exclamation-points) – Quentin

+1

और यह भी जांचें http://www.javascriptturnsmeon.com/the-tilde-operator-in-javascript/ –

उत्तर

11

यूनरी ऑपरेटरों को बस इसे दाएं से बाएं से व्याख्या करने की आवश्यकता है। ~ बिटवाई "नहीं" ऑपरेटर है, और ! बुलियन उलटा है। इस प्रकार, उन तीन:

  • एक पूर्णांक के लिए वापसी मान परिवर्तित
  • पूर्णांक
  • के टुकड़े को उलटने "truthiness" (शून्य या गैर शून्य, false या true)
  • के लिए संख्या का निरीक्षण
  • बूलियन मान को उलटने के
  • की विपरीत इसे फिर से

~ यहाँ tricki है EST। "खोज" दिनचर्या (मैं अनुमान लगाता हूं) -1 देता है जब उसे कुछ भी नहीं मिलता है। ~ ऑपरेटर -1 से 0 बदलता है, इसलिए ~ लक्ष्य को मिलने पर true (गैर-शून्य) के रूप में "खोज" वापसी मान को समझने की अनुमति देता है, और false (शून्य) यदि नहीं है।

! — के बाद के आवेदन के बाद के आवेदन — परिणाम को एक वास्तविक बूलियन मान होने के लिए मजबूर करता है। यह दो बार लागू होता है ताकि true/false समझ बनाए रखा जा सके। संपादित करें ध्यान दें कि इस विशेष कोड में बूलियन के लिए मजबूर रूपांतरण आवश्यक नहीं है; if कथन का सामान्य अर्थशास्त्र ~ ऑपरेटर के परिणामस्वरूप ठीक काम करेगा।

+0

@NPE अब अपडेट किया गया – Pointy

+0

संदर्भ के लिए, '!!' पूरी तरह से अनावश्यक है। यदि आप बाद में परिणाम संग्रहित कर रहे थे तो आपको केवल इसकी आवश्यकता होगी और यह सुनिश्चित करना चाहता था कि यह एक बूलियन था। 'If' में तत्काल उपयोग के लिए, यह अधिक है। – cHao

+0

@cHao हाँ, * इस * उदाहरण में यह आवश्यक नहीं है। – Pointy

4

असल में, .search उस स्थिति को लौटाता है जिस पर उसे परिणाम मिलता है, या -1 यदि यह मेल नहीं खाता है। सामान्य लोग बस लिखना होगा:

if(varA.search(re) > -1) 

लेकिन व्यक्तिगत रूप से मैं बस का उपयोग करेंगे:

if(varA.match(re)) 
+1

आपका दूसरा उदाहरण '-1' के लिए 'सत्य' वापस करेगा, झूठी सकारात्मक – Bojangles

+1

@ बोजंगल: मुझे कुछ याद आना चाहिए। मुझे यहां झूठी सकारात्मक स्थिति का मौका नहीं दिख रहा है। ध्यान दें कि दूसरा उदाहरण '.search' के बजाय' .match' का उपयोग करता है। – cHao

+0

यदि 'varA.search()' '' 'लौटाता है, तो' if() 'संतुष्ट होगा, हालांकि _no मिलान नहीं मिला था, इसलिए एक झूठी सकारात्मक – Bojangles

0

laymans संदर्भ

~ 

कर रहा है में - (N + 1) और

!! 

पहली बैंग संख्या से एक बूलियन तक जाती है, और दूसरा तार्किक रूप से सामने आता है जो पहले बैंग द्वारा किया गया था।

इस वेबसाइट पर एक नज़र डालें।
यह है कुछ स्पष्टीकरण

http://dreaminginjavascript.wordpress.com/2008/07/04/28/

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