क्या अल्पविराम से असाइनमेंट काम करता है?


108

क्यों aaa = 1,2,3काम करता है और का मूल्य निर्धारित करता aaaहै 1?

var bbb = 1,2,3काम क्यों नहीं करता?

क्यों var bbb = (1,2,3)काम करता है और का मूल्य निर्धारित करता bbbहै 3?

उदाहरण कंसोल सत्र


9
आपको सिंटैक्स त्रुटि मिलती है क्योंकि चर नामों को किसी संख्या के साथ शुरू करने की अनुमति नहीं है। var a1,a2,a3;बस तीन स्थानीय चर घोषित करेगा।
जारेड फरिश

जवाबों:


200

यहाँ बहुत कुछ चल रहा है, लेकिन मूल रूप से, यह अल्पविराम ऑपरेटर के लिए आता है ।

अल्पविराम ऑपरेटर अपने दोनों ऑपरेंड (बाएं से दाएं) का मूल्यांकन करता है और दूसरे ऑपरेंड का मान लौटाता है।


यह कोड:

aaa = 1,2,3

के बराबर है:

aaa = 1;
2;
3;

तो aaaअनुमानित रूप से घोषित किया गया है और 1. मान दिया गया है। ध्यान दें कि कंसोल पर आउटपुट अंतिम विवरण का परिणाम है, 3।


यह कोड:

var bbb = 1,2,3

एक सिंटैक्स त्रुटि है क्योंकि वैरिएबल घोषणाओं में कॉमा का उपयोग एक ही पंक्ति में कई चर घोषित करने के लिए किया जाता है। जैसा कि एमडीएन लेख बताता है,

ध्यान दें कि में अल्पविराम varबयान है अल्पविराम ऑपरेटर है, क्योंकि यह एक अभिव्यक्ति के भीतर मौजूद नहीं है। बल्कि, varउनमें से कई को एक में संयोजित करने के लिए बयानों में यह एक विशेष चरित्र है ।

तो यह कोड लगभग बराबर है:

var bbb = 1;
var 2;
var 3;

बेशक, 2एक वैध पहचानकर्ता नहीं है, इसलिए यह उस बिंदु पर विफल रहता है।


यह कोड:

var bbb = (1,2,3)

पहले के समान है, सिवाय इसके कि संख्यात्मक मान एक कोष्ठक में लिपटे हुए हैं, पहले उनका मूल्यांकन किया जाता है। तो यह पूरी तरह से इसके बराबर है:

1;
2;
var bbb = 3;

17
इससे भी अधिक, =में var bbb = 1;के =रूप में ही नहीं है aaa = 1;- वे व्याकरण में विभिन्न प्रस्तुतियों (प्रारंभिक बनाम AssignmentExpression) से आते हैं और सिर्फ एक ही टोकन का उपयोग करने के लिए होता है।
रयान कैवानुआग

7
बहुत अच्छी व्याख्या। जो पूरी तरह से स्पष्ट नहीं था, a = 1, 2, 3वह कोष्ठबद्ध किया जा सकता है, जैसा (a = 1), 2, 3कि मूल्यांकन करता है a = 1; 2; 3(और रिटर्न 3, जैसे b = (a = 1, 2, 3)3 से बी असाइन करेगा)। इसके विपरीत, के a = (1, 2, 3)रूप में मूल्यांकन करता है 1; 2; a = 3और 3 लौटाता है
19

चर असाइनमेंट में parens के बारे में MDN क्या कहता है और यह रिवर्स में क्यों है? मैं डॉक्टर
ब्रायन

@staticx कुछ भी वास्तव में 'रिवर्स' में नहीं किया जाता है। कोष्ठकों का मूल्यांकन पहले किया जाता है। जैसे जब आपके पास होता है (1 + 2) * 3, 1 + 2पहले मूल्यांकन किया जाता है और उस अभिव्यक्ति के परिणाम को बाकी मूल्यांकन के लिए बाहरी अभिव्यक्ति में बदल दिया जाता है।
pswg

9

जावास्क्रिप्ट में कॉमा के कई उपयोग हैं। अभिव्यक्ति में:

a = 1, 2, 3;

यह एक ऑपरेटर है जो बस अपने दाहिने हाथ का तर्क देता है। लेकिन यह varघोषणाओं के वाक्य-विन्यास का भी हिस्सा है , जो हैं:

var var1 [ = val1 ], var2 [ = val2 ], var3 [ = val3 ], ...;

(जहां [...]इसका मतलब है कि वह हिस्सा वैकल्पिक है)। आपकी varघोषणा अल्पविराम के बाद चर नामों को याद कर रही है, इसलिए यह पार्स नहीं करता है। आपको वह प्रभाव मिल सकता है जो आप चाहते थे:

var a = (1, 2, 3);

कोष्ठक अल्पविरामों को परिवर्तनीय घोषणाओं के बीच परिसीमाकों के बजाय संचालकों के रूप में माना जाता है।


7

आपके उदाहरण में, अल्पविराम का उपयोग दो संदर्भों में किया जाता है:

var बयान

varकथन का वाक्य विन्यास है:

var varname1 [= value1 [, varname2 [, varname3 ... [, varnameN]]]];

यहाँ, अल्पविराम का उपयोग वैरिएबल नाम-मान युग्मों को अलग करने के लिए किया जाता है। निम्नलिखित काम नहीं करेगा क्योंकि एक चर नाम अंक के साथ शुरू नहीं हो सकता है ( पहचानकर्ता नाम देखें ):

var bbb = 1, 2, 3;
// SyntaxError: Unexpected number

कोमा संचालक

अल्पविराम ऑपरेटर अपने दोनों ऑपरेंड (बाएं से दाएं) का मूल्यांकन करता है और दूसरे ऑपरेंड का मान लौटाता है। निम्न अभिव्यक्तियाँ निम्नानुसार काम करती हैं:

aaa = 1, 2, 3;
  • aaa = 1, 2 पैदावार २
    • ध्यान दें कि aaa = 1पहले मूल्यांकन किया जाता है क्योंकि =की तुलना में उच्च प्राथमिकता है,
  • 2, 3 पैदावार ३
var bbb = (1, 2, 3);
  • जैसा कि ऊपर वर्णित है अभिव्यक्ति की (1, 2, 3)पैदावार3
  • चर bbbको मान दिया गया है3

2
aaa = 1, 2, 3=> अल्पविराम ऑपरेटर अलग करने के लिए निम्नलिखित 3 बयानों प्रयोग किया जाता है: aaa=1, 2और 3। अल्पविराम ऑपरेटर का परिणाम अंतिम विवरण 3 का मूल्य है। हालांकि, आआ को 1 का मान दिया गया है, जैसा कि ओपी के स्क्रीनशॉट से स्पष्ट रूप से देखा जा सकता है। इसका कारण ऑपरेटर की पूर्ववर्तीता है, जिसमें कोमा संचालक की सबसे कम वरीयता है।
टिबोस

1

पहले मामले में:

आआआ = 1,2,3

अल्पविराम अभिव्यक्ति विभाजक के रूप में कार्य करता है। यह करने के लिए एक कार्य करता है aaa, तो यह गणना करता है 2और इसे त्याग देता है, फिर यह गणना करता है 3और इसे त्याग देता है।

क्षण में:

var bbb = 1,2,3

varकीवर्ड जावास्क्रिप्ट संकलक है कि एक के बाद अगली बात कहता है ,एक और चर नाम होना चाहिए। यह नहीं मिल रहा है, इसलिए यह मर जाता है और gags।

var bbb = (1,2,3)

यहाँ, संकलक पहले इसका मूल्यांकन 1और उपेक्षा करता है। तब यह उसका मूल्यांकन 2और उपेक्षा करता है। फिर यह मूल्यांकन करता है 3और इसे स्टैक पर छोड़ दिया जाता है ताकि इसे सौंपा जाएbbb

अलग-अलग अभिव्यक्तियों के लिए अल्पविराम का उपयोग करना आम नहीं है, यह कभी-कभी चीजों में उपयोगी होता है जैसे कि forदिखता है।

for (i = 0, l = 10; i < l; i++) {
  console.log(i);
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.