2013-09-05 1 views
18

पिछले कुछ दिनों में, मैं एक दोस्त को जावास्क्रिप्ट सीखने में मदद कर रहा हूं। यह वर्षों में उनकी पहली भाषा है और वह लगभग कुछ भी याद नहीं करता है, इसलिए वह पूरी तरह से खरोंच से पूरी तरह से शुरू कर रहा है। वह एक साधारण ट्यूटोरियल के माध्यम से जा रहा है और मैं उसे अभ्यास करने में मदद करने के लिए कुछ अभ्यास प्रदान कर रहा हूं। मैंने हालिया अभ्यास को (स्पष्ट रूप से) क्लासिक FizzBuzz problem दिया था। उन्होंने इसे थोड़ी मदद से हल किया, लेकिन उन्होंने अपने समाधान के दौरान कुछ बहुत ही रोचक काम किया। उन्होंने कहा कि निम्न कोड के साथ आया था:क्या कमांड जावास्क्रिप्ट में वाक्यबद्ध रूप से मान्य होने के लिए हैं?

for (var x = 1; x <= 100; x++) { 
    if (x%3 == 0, x%5 != 0) { 
     console.log("Fizz"); 
    } 
    else if (x%3 != 0, x%5 == 0) { 
     console.log("Buzz"); 
    } 
    else if (x%3 == 0, x%5 == 0) { 
     console.log("FizzBuzz"); 
    } 
    else { 
     console.log(x); 
    } 
} 

वह बूलियन तुलना ऑपरेटरों से परिचित नहीं था, इसलिए वह && और बजाय प्रयोग किया अल्पविराम का उपयोग नहीं किया। मेरी उम्मीद थी कि यह क्रैश हो जाएगा और सिंटैक्स त्रुटि के बारे में कुछ कहेंगे, लेकिन मेरे आश्चर्य के लिए यह ठीक चल रहा है और "फिजबज़" या संख्याओं के साथ "फिज" और "बज़" लाइनों का एक गुच्छा प्रिंट कर रहा है। कहने की जरूरत नहीं है, मैं उलझन में था, इसलिए मैंने थोड़ा प्रयोग किया। मेरा पहला परीक्षण इस चलाने के लिए किया गया था:

if (true, true) console.log('true, true'); 
if (true, false) console.log('true, false'); 
if (false, true) console.log('false, true'); 
if (false, false) console.log('false, false'); 

कौन सा मुझे दो उत्पादन की तर्ज दिया:

'true, true' 
'false, true' 

कि से, मुझे लगता है कि सब किया अल्पविराम था कि यह कुछ भी नहीं है लेकिन पिछले मूल्यांकन करने के लिए कारण बना सूची में अभिव्यक्ति। मैं तो इस कोड चलाने की कोशिश की:

for (var i = 0; i < 16; i++) { 
    if ((Math.floor(i/8) == 1), (Math.floor(i/4) == 1), (Math.floor(i/2) == 1), (i % 2 == 1)) { 
     console.log(i); 
    } 
} 

उत्पादन मुझे मिल गया था 1-15, जो मेरा पहला परीक्षण से मेरा अनुमान की पुष्टि से सभी विषम संख्या (के बाद से अल्पविराम से अलग सूची में अंतिम बूलियन हर flipping था अन्य पुनरावृत्ति)।

सभी लंबे समय तक चलने वाले संदर्भ के बाद, मेरा प्रश्न यह है: क्या यह अल्पविराम जावास्क्रिप्ट इंजन का एक ज्ञात और जानबूझकर टुकड़ा है, या यह दुभाषिया का एक अजीब, अनदेखा क्विर्क है? मुझे पता है कि अल्पविरामों को कुछ अन्य चीजों के लिए इस्तेमाल किया जा सकता है (एक पंक्ति में एकाधिक चर शुरू करना, सरणी घोषित करना, और पैरामीटर को अलग करने के लिए अलग करना), लेकिन मैंने कभी भी किसी भी भाषा में इस तरह के सशर्त बयान में उपयोग नहीं किया है, और मैं उत्सुक हूं अगर कोई और जानता है कि यह कोड भी चलाना चाहिए या नहीं।

संदर्भ के लिए, FizzBuzz कोड और दूसरा परीक्षण जो मैंने भाग लिया था, दोनों नोड का उपयोग करके किया गया था, और पहला टेस्ट जो मैंने भाग लिया था क्रोम में जावास्क्रिप्ट कंसोल में किया गया था, इसलिए यह सिर्फ एक ब्राउज़र- या नोड-अनन्य क्विर्क अगर वास्तव में यह एक है। इसके अलावा, अगर आप वास्तव में इसे अभी तक पढ़ते हैं, तो धन्यवाद।

+0

जब सब कुछ विफल हो जाता है, तो हमेशा विनिर्देश होता है: [11.14 कॉमा ऑपरेटर (,)] (http://www.ecma-international.org/ecma-262/5.1/#sec-11.14) – RobG

+0

अब आप अल्पविराम ऑपरेटर के कुछ स्पष्टीकरण हैं, ध्यान दें कि दिखाया गया कोड वाक्य रचनात्मक रूप से मान्य है लेकिन FizzBuzz समस्या का समाधान नहीं करता है। (या आप कह रहे थे कि यह वैध समाधान के रास्ते पर सिर्फ एक कदम था?) – nnnnnn

उत्तर

26

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

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Comma_Operator

इसकी सबसे आम उपयोग एक for पाश में अनेक पैरामीटर आपूर्ति करने के लिए है, लेकिन यह भी अन्य प्रयोजनों के लिए इस्तेमाल किया जा सकता।

+2

हू। जाहिर है, मैं गुगलिंग में बुरा हूं, फिर। मैंने इसे ऑपरेटर के रूप में देखने की कोशिश की और पूरी तरह असफल रहा। जल्दी जवाब देने का शुक्रिया। – Alex

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