2012-03-06 9 views
8

कृपया कोई क्या कोड की इस पंक्ति करता है मुझे समझा कर सकते हैं:JavaScript वेरिएबल वापस आने

var list = calls[ev] || (calls[ev] = {}); 

मेरे सर्वोत्तम अनुमान:

यह चर "सूची" calls.xxx, जहां के मूल्य के साथ सेट करता है xxx एक चर है, ev। यदि कॉल [ev] मौजूद नहीं है, तो यह इसे एक खाली वस्तु के रूप में बना रहा है और उस खाली वस्तु को "सूची" में निर्दिष्ट कर रहा है। क्या वह सही है?

ब्रांड्स का उपयोग क्यों किया जा रहा है? || का उपयोग करने पर मुझे और जानकारी कहां मिल सकती है चर सेट करते समय, और इस संदर्भ में ब्रांड्स का उपयोग करते समय? धन्यवाद!

+0

ब्रांड्स केवल अभिव्यक्ति का सही मूल्यांकन सुनिश्चित कर रहे हैं, क्योंकि '||' असाइनमेंट ऑपरेटर '=' की तुलना में अधिक प्राथमिकता है। कंस्ट्रैसिस के बिना, इसे 'var list = (कॉल [ev] || कॉल [ev]) = {};' के रूप में मूल्यांकन किया गया था और परिणामस्वरूप एक त्रुटि होगी। [एमडीएन जावास्क्रिप्ट संदर्भ] (https://developer.mozilla.org/en/JavaScript/Reference) बहुत व्यापक है। –

+0

संभावित डुप्लिकेट [|| क्या करता है ऑपरेटर करते हैं?] (http://stackoverflow.com/questions/830618/what-does-the-operator-do) –

उत्तर

8

इस कोड भाषा का

var list; 
if (calls[ev]) 
    list = calls[ev]; 
else { 
    calls[ev] = {}; 
    list = calls[ev]; 
} 

दो विशेषताएं उपयोग किया जाता है के बराबर है:।

  1. बूलियन अभिव्यक्ति (के शॉर्टकट गणना a || b पर विचार करें a है true तो b नहीं है का मूल्यांकन)। इस प्रकार, यदि आप var v = a || b; और a असाइन करते हैं तो true पर डाला जा सकता है, तो b का मूल्यांकन नहीं किया जाता है।
  2. असाइनमेंट बयान पिछले सौंपा मूल्य का मूल्यांकन (var a = b = c; सक्षम करने के लिए)

कोष्ठकों जरूरी हैं इस व्याख्या से बचने के लिए:

var list = (calls[ev] || calls[ev]) = {}; 

(जो एक त्रुटि है)।

1

|| या 'तार्किक या' है एक उच्च precedence असाइनमेंट ऑपरेटर = से, इस प्रकार कोष्ठक आवश्यक यह मुहावरा सही क्रम

दूसरी बात के बारे में पता होने के लिए मूल्यांकन करता है सुनिश्चित करने के लिए कर रहे हैं, यह है कि कई भाषाओं है जावास्क्रिप्ट में शामिल हैं, एंड्रॉइड जैसे ओलंपिक ऑपरेटरों के short-circuit evaluation प्रदान करें। यदि तार्किक-या वास्तविक मूल्यांकन का पहला संचालन, दूसरे ऑपरेंड का मूल्यांकन करने की कोई आवश्यकता नहीं है, क्योंकि इससे परिणाम में कोई फर्क नहीं पड़ता है।

इसे समझें, और आप देखेंगे कि यह कुछ विशेष असाइनमेंट सिंटैक्स नहीं है, लेकिन एक मुहावरे या पैटर्न, जो एक भाषा सुविधा का शोषण करता है ताकि एक विचार का अधिक कॉम्पैक्ट प्रतिनिधित्व प्रदान किया जा सके।

+0

उपयोगी लिंक, धन्यवाद। – thugsb

5

आपका अनुमान सही है। जावास्क्रिप्ट में चर के लिए "डिफ़ॉल्ट" मान घोषित करने का यह एक आम तरीका है।

function foo(bar) { 
    var bar = bar || 0; //This sets bar to 0 if it's not already set 
    console.log(bar); 
} 

तरीका यह काम करता है कि जावास्क्रिप्ट में, एक अपरिभाषित चर falsy है, जिसका अर्थ है कि किसी भी बूलियन comparaison ऑपरेशन में, यह false का मूल्यांकन होगा। फिर आप दो मानों को गठबंधन करने के लिए OR ऑपरेटर का उपयोग कर सकते हैं और यह पहला मान वापस करेगा जो true का मूल्यांकन करता है।

+0

धन्यवाद, मैं यहां उस स्पष्टीकरण की तलाश में पहुंचा। – NiloVelez

1

आप अपने पहले अनुमान के बारे में सही हैं। यह जावास्क्रिप्ट नेमस्पेस प्रारंभ करने के लिए एक आम पैटर्न है। यह सुनिश्चित करने के लिए कार्य करता है कि आप पिछले ऑब्जेक्ट को उसी नाम से ओवरराइट नहीं करते हैं। सबसे लोकप्रिय पुस्तकालय अपनी नेमस्पेस ऑब्जेक्ट्स बनाने के लिए कुछ ऐसा ही करेंगे।

ब्रांडेसिस वहां है ताकि अभिव्यक्ति का उचित क्रम में मूल्यांकन किया जा सके।

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