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


89

अगर मैं उपयोग करता हूं:

1.09 * 1; // returns "1.09"

लेकिन अगर मैं उपयोग करता हूं:

1,09 * 1; // returns "9"

मुझे पता है कि 1,09 नंबर नहीं है।

कोड के अंतिम भाग में अल्पविराम क्या करता है?

और ज्यादा उदाहरण

if (0,9) alert("ok"); // alert
if (9,0) alert("ok"); // don't alert

alert(1); alert(2); alert(3); // 3 alerts
alert(1), alert(2), alert(3); // 3 alerts too

alert("2",
    foo = function (param) {
        alert(param)
    },
    foo('1')
)
foo('3'); // alerts 1, 2 and 3

1
मुझे आश्चर्य है कि अष्टक शाब्दिक में 09 अवैध '9' के लिए विफल नहीं है।
पुनरावर्ती

7
@recursive - ऑक्टल प्रतिनिधित्व में कोई भी 9 दशमलव में गिरावट का परिणाम है।
युवल एडम

तर्क सूची में अल्पविराम को भ्रमित न करें। alertकेवल एक तर्क लेता है। उसके बाद कुछ भी त्याग दिया जाता है।
एंड्रयू

@Andrew: हाँ, अलर्ट द्वारा त्याग दिया गया है (), जो केवल एक तर्क लेता है, लेकिन इसे चलाया जाएगा! वह अजीब है। धन्यवाद।
टोपेरा

1
@ तोपेरा: वास्तव में अजीब नहीं है अगर आप इसके बारे में जेएस के दृष्टिकोण से सोचते हैं। जेएस में आपको अपने फ़ंक्शन घोषणा में अपनी तर्क सूची निर्दिष्ट करने की आवश्यकता नहीं है (आप argumentsइसके बजाय ऑब्जेक्ट का उपयोग कर सकते हैं , जो किसी भी लंबाई का हो सकता है)। आधुनिक संकलित जेएस के साथ भी, समय से आगे यह बताने का कोई तरीका नहीं होगा कि एक फ़ंक्शन कितने तर्क लेगा। इस पर विचार करें: function test() { args=[]; for (var i = 0; i < arguments.length; i++) { args.push(arguments[i] + 1); } ;दुभाषिया को यह जानना होगा कि फ़ंक्शन का उपयोग यह जानने के लिए किया जा रहा है कि यह कितने आर्गन ले जाएगा। इसके बजाय, यह सब कुछ का मूल्यांकन करता है।
एंड्रयू

जवाबों:


95

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

स्रोत: https://developer.mozilla.org/en/JavaScript/Reference/Operators/Special_Operators/Comma_Operator

उदाहरण के लिए, अभिव्यक्ति का 1,2,3,4,5मूल्यांकन करता है 5। स्पष्ट रूप से अल्पविराम ऑपरेटर केवल साइड-इफेक्ट वाले ऑपरेशन के लिए उपयोगी है।

console.log(1,2,3,4,5);
console.log((1,2,3,4,5));


2
उन्होंने इसे सी से लिया। मुझे लगता है कि यह केवल उन भावों के लिए उपयोगी है जिनके दुष्प्रभाव हैं।
रेडोमिर डोपिराल्स्की

3
मैं ऐसे कई मामलों के बारे में नहीं सोच सकता, जहां अल्पविराम ऑपरेटर किसी भी प्रभावित करने के लिए उपयोग किया जाता है, लेकिन पात्रों को सहेजना (छोटा करना) या कोड को बाधित करना है।
user17753

1
@ user17753 इसका उपयोग forलूप के अर्धविराम से अलग किए गए अनुभाग में वैध रूप से किया जा सकता है ।
साइओस

1
@ कोको: जबकि यह सच है, आम तौर पर इस तरह के तर्क बोलना लूप बॉडी में अधिक स्पष्ट रूप से किया जाता है। कुछ लोग तब दावा करेंगे कि उनका तरीका continueदोहराव के बिना कई बिंदुओं के लिए अनुमति देता है , लेकिन फिर आपके पास कई continueबिंदु नहीं होने चाहिए ।
ऑर्बिट

@ user17753 आप पैसे पर हैं; छोटा कोड समझने की कोशिश कर रहा हूँ कि मैं यहाँ क्यों हूँ
शायद ही 'मोनिका'

6

कुछ और विचार करने के लिए:

console.log((0, 9));
console.log((9, 0));
console.log(("foo", "bar"));


7
लोल, यह मजेदार है:alert("1", alert("2", alert("3")))
टोपेरा

1
@Andrew: उफ़, मैंने अपने जवाब को अपडेट कर दिया है कि मुझे क्या करना है।
डगलस

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

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

https://stackoverflow.com/a/3561056/5934465

यह इस तरह होना चाहिए!

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

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


5
अल्पविराम ऑपरेटर दो ऑपरेंड लेता है, इसलिए मूल उद्धरण सही था। आप जिस बारे में बात कर रहे हैं, वह ऐसे भावों को समाप्त करने का अंतिम परिणाम है, लेकिन इसका अर्थ है कि आपकी प्रतिस्थापन बोली को गलत तरीके से समझा गया है। a,b,c,dहै((((a),b),c),d)
हल्की दौड़

1

यहाँ एक नज़र है - अल्पविराम कई अभिव्यक्तियों / कथनों के लिए है। अपने कोड में उदाहरण के लिए आप इस तरह से एक लाइन का उपयोग कर सकते हैं:

var a=0, b=0, c=0;

यह लेखन के बिना सभी तीन चर घोषित करेगा:

var a=0;
var b=0;
var c=0;

उम्मीद है की वो मदद करदे।


23
यह थोड़ा पुराना है, लेकिन नोट करना महत्वपूर्ण है: (1) आपके द्वारा प्रदान किया गया उदाहरण कॉमा ऑपरेटर का उपयोग नहीं करता है ( varघोषणाएं अल्पविराम ऑपरेटर का उपयोग नहीं करते हैं , भले ही यह एक अल्पविराम हो) और (2) आप अलग नहीं कर सकते अल्पविराम ऑपरेटरों का उपयोग करते हुए मूर्तियां; केवल अभिव्यक्तियों की अनुमति है।
कांता 94 भारी

0

किसी वस्तु में गुणों को जोड़ना / जोड़ना और इसे एक ही पंक्ति में वापस करना एक संभावित उपयोग-मामला है:

console.log(
  ((x) => (o = {biggerCond: r => r >= x},
           o.r5 = Array.from(window.crypto.getRandomValues(new Uint16Array(5))),
           o.isAnyBigger = o.r5.some(o.biggerCond),
           o.bigger = o.isAnyBigger ? o.r5.filter(o.biggerCond) : [x], o )
  )(5e4)
);
// Example
// {
//   bigger: [58414, 56500, 63397],
//   isAnyBigger: true,
//   isBiggerCond: r => r >= x,
//   r5: [58414, 12015, 56500, 63397, 43861]
// }

उपरोक्त अनाम फ़ंक्शन इनपुट वैल्यू के साथ यादृच्छिक मानों के साथ एक वस्तु लौटाता है या, यदि कोई नहीं है, तो इनपुट एरे में ही किसी ऐरे में निहित है। bigger संपत्ति ।

यह अभी भी वाक्य रचना चीनी है ( तीर के कार्यों की तरह ), लेकिन यह लाइनों की संख्या को छोटा करता है ... मुझे आश्चर्य है कि अगर कुछ जेएस मिनिफ़ायर कोड को समान तरीके से स्वचालित रूप से पहचानते हैं और समायोजित करते हैं। इसे अपने कंसोल में चलाएँ:

((x)=>(o={biggerCond:r=>r>=x},o.r5=Array.from(window.crypto.getRandomValues(new Uint16Array(5))),o.isAnyBigger=o.r5.some(o.biggerCond),o.bigger=o.isAnyBigger?o.r5.filter(o.biggerCond):[x],o))(5e4)

2
लेकिन निश्चित रूप से आप उत्पादन कोड में इस तरह के गुप्त झुकाव नहीं डालेंगे, है ना?
ऑर्बिट

@LightnessRacesinOrbit अच्छी तरह से, मैं कहूंगा कि यह उद्देश्य पर निर्भर करता है (जैसे शिक्षण, कोड को छोटा करना, कोई चर / फ़ंक्शन घोषणाओं आदि)। यदि आप इसे ऊपर बताए अनुसार, जैसा कि मैंने ऊपर किया है, यह पूरी तरह से पठनीय है ... ध्यान नहीं देना चाहिए कि आपने "गुप्त" शब्द का प्रयोग किया है :)
CPHPython

1
हेह, वह भी जानबूझकर नहीं किया गया था
हल्बी की दौड़ ऑर्बिट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.