2010-08-02 7 views
24

जेएस या उसके वाक्यविन्यास के लिए नया नहीं है, लेकिन कभी-कभी, भाषा के अर्थशास्त्र ने मुझे कभी-कभी स्टंप किया है।जावास्क्रिप्ट में, जंजीर असाइनमेंट ठीक है?

var a = b = []; 

रूप

var a = [], b = []; 

या

var a = []; var b = []; 

ही के बाद से पहला संस्करण वास्तव में एक करने के लिए एक खाली सरणी के संदर्भ प्रदान करती नहीं है: काम पर आज एक सहकर्मी ने इस उल्लेख किया और बी। मैं इसे सच के रूप में स्वीकार नहीं कर सका, लेकिन मुझे यकीन नहीं है। आप सब क्या सोचते हैं?

+3

http://stackoverflow.com/questions/1758576/multiple-left-hand-assignment-with-javascript देखें/1758 9 12 # 1758 9 12 –

+0

धन्यवाद, क्रिसेंट ताजा - मुझे उस सवाल को बिल्कुल नहीं देखा क्योंकि मैं "जंजीर असाइनमेंट" की तलाश में था। – JamieJag

उत्तर

32

हाँ, वे एक ही नहीं कर रहे हैं। var a = b = []

var a; 
b = []; 
a = b; 

इतना ही नहीं दोनों a और b मिल ही मूल्य (समान खाली सरणी के लिए एक संदर्भ) सौंपा, b सब पर घोषित नहीं किया गया है है के बराबर है। ECMAScript 5 में strict mode में और बाद में, यह ReferenceError फेंक देगा; अन्यथा, जब तक कि पहले से ही एक चर b गुंजाइश में नहीं है, b चुपचाप वैश्विक वस्तु की संपत्ति के रूप में बनाया गया है और एक फ़ंक्शन के अंदर भी, जहां भी कोड है, वैश्विक वैरिएबल के समान कार्य करता है। जो अच्छा नहीं है।

आप काफी आसानी से देख सकते हैं: पहला उदाहरण b साथ

(function() { 
    var a = b = []; 
})(); 

window.console.log(b); // Shows [] 
+1

मैंने बी को ग्लोबल वैरिएबल होने के तुरंत बाद नहीं देखा, धन्यवाद! – JamieJag

+4

+1 एक अनजान संदर्भ के लिए असाइनमेंट से बचने का एक अन्य कारण यह है कि ईएस 5 पर, सख्त मोड के तहत, 'रेफरेंस एरर' फेंक दिया जाएगा। – CMS

4

आपका सहयोगी सही है। पहला कथन एक नया, खाली सरणी बनाता है। फिर, इस सरणी का संदर्भ बी को सौंपा गया है। फिर, वही संदर्भ (जो असाइनमेंट अभिव्यक्ति का परिणाम है) को असाइन किया गया है। तो ए और बी एक ही सरणी का संदर्भ लें।

अन्य सभी मामलों में, आप दो अलग-अलग सरणी बनाते हैं।

वैसे: यह व्यवहार काफी आम है और सभी सी आधारित प्रोग्रामिंग भाषाओं में समान है। तो यह जावास्क्रिप्ट विशिष्ट नहीं है।

+0

आपके उत्तर, टोबीस के लिए धन्यवाद, और सभी सी-आधारित भाषाओं में समानता को इंगित करने के लिए भी। – JamieJag

+0

यह जेएस में सरणी के साथ परीक्षण किया जा सकता है: '[" कुत्ता "] === [" कुत्ता "]; 'झूठा रिटर्न, लेकिन' var a = b = [" कुत्ता "]; एक === बी; 'सच आता है। – b00t

9

आपका सहयोगी सही है:

var a = b = []; 
a.push('something'); 
console.log(b);   // outputs ["something"] 

लेकिन:

var a = [], b = []; 
a.push('something'); 
console.log(b);   // outputs [] 
3

a लिए एक संदर्भ है, और b एक वैश्विक चर, कहीं से भी सुलभ हो जाता है (और यह किसी भी b चर कि पहले से ही मौजूद हो सकता है की जगह वैश्विक दायरे में)।

1

इसे पूरा करने के लिए, आपको var जंजीर असाइनमेंट से घोषणा को विभाजित करने की आवश्यकता है (देखें: http://davidshariff.com/blog/chaining-variable-assignments-in-javascript-words-of-caution/)।

उदा।

var one = 1, two = 2; 

one = two = 3; /* Now both equal 3 */ 

लेकिन जैसा कि आप, वैश्विक अंतरिक्ष में (इस उदाहरण में var one = two = 3;) वर्णित two लीक जबकि one स्थानीय दायरे में घोषित किया जाता है अगर आप।

0

पहले से ही प्रदान किए गए उत्तरों के पूरक के लिए।रेफरी कार्य मूल्य कार्य

var x = y = 3; // by value 
y++; // 4 
x; // 3 

var a = b = []; // by ref 
b.push(1); // [1]; 
a; // [1] 
a; = []; 
a.push(2); // [2]; 
b; // [1] 

से अलग हैं अब जब हम 2 दो सुलझा लिया है, अपने प्रश्न भी linting के संदर्भ में है, जो "सुंदर कोड" (कार्यात्मक नहीं) की प्रथा है बनाता है। वास्तव में, JSHint has deprecated all their "pretty code rules"

यही कहा गया, मैं आमतौर पर उपयोग करें निम्नलिखित style.-

var a, b, c, // first row all unassigned 
    x = 1, // 1 row per assigned 
    y = 2, 
    list = [ 
     'additional', 
     'indentation' 
    ], 
    obj = { 
     A: 'A', 
     B: 'B' 
    }; 
var z = y +2; // created a new `var` cluster since it uses a var from the previous