मैंने अभिव्यक्ति ( ) और एमडीएन डॉक्स में "अल्पविराम ऑपरेटर" के बारे में यह प्रश्न पढ़ा है, लेकिन मैं ऐसे परिदृश्य के बारे में नहीं सोच सकता जहां यह उपयोगी है।,
तो, अल्पविराम ऑपरेटर कब उपयोगी है?
मैंने अभिव्यक्ति ( ) और एमडीएन डॉक्स में "अल्पविराम ऑपरेटर" के बारे में यह प्रश्न पढ़ा है, लेकिन मैं ऐसे परिदृश्य के बारे में नहीं सोच सकता जहां यह उपयोगी है।,
तो, अल्पविराम ऑपरेटर कब उपयोगी है?
,
ऑपरेटर के साथ कुछ भी लेना-देना है । वह लाइन भी मान्य है C#
, लेकिन ,
ऑपरेटर वहां मौजूद नहीं है।
,
हमेशा ,
ऑपरेटर नहीं होते हैं (और यह कभी भी ,
C # में ऑपरेटर नहीं होता है )। तो C # सिंटैक्स के हिस्से के रूप में ,
स्वतंत्र ,
रूप से उपयोग करते हुए एक ऑपरेटर की कमी कर सकता है ।
,
व्यापक रूप से उपयोग नहीं किया जाता है (और प्रत्येक घटना ,
अल्पविराम ऑपरेटर नहीं है) । लेकिन आप एक अस्थायी चर बनाने के बिना एक चर स्वैप इनलाइन करने के लिए इसे और एक ऐरे को उधार ले सकते हैं। यह देखते हुए कि आप के मूल्यों को स्वैप करना चाहते हैं a
और b
आप कर सकते हैं a = [b][b = a,0]
। यह b
ऐरे में करंट लगाता है। दूसरा []
है प्रॉपर्टी एक्सेस नोटेशन। इंडेक्स एक्सेस किया गया है 0
, लेकिन असाइन a
करने से पहले नहीं b
, जो अब सुरक्षित है क्योंकि b
एरे में रखा गया है। ,
हमें में एक से अधिक भाव करने की सुविधा देता []
।
जवाबों:
निम्नलिखित शायद बहुत उपयोगी नहीं है क्योंकि आप इसे स्वयं नहीं लिखते हैं, लेकिन एक अल्पविराम अल्पविराम ऑपरेटर का उपयोग करके कोड को छोटा कर सकता है। उदाहरण के लिए:
if(x){foo();return bar()}else{return 1}
बन जाएगा:
return x?(foo(),bar()):1
? :
ऑपरेटर, अब के बाद से इस्तेमाल किया जा सकता अल्पविराम ऑपरेटर (कुछ हद तक) की अनुमति देता है के लिए दो बयान एक बयान के रूप में लिखा जाना।
इसमें यह उपयोगी है कि यह कुछ साफ संपीड़न (39 -> 24 बाइट्स) के लिए अनुमति देता है।
मैं तथ्य यह है कि में अल्पविराम तनाव करना चाहते हैं var a, b
है नहीं अल्पविराम ऑपरेटर है क्योंकि यह एक के भीतर मौजूद नहीं है अभिव्यक्ति । var
बयानों में अल्पविराम का एक विशेष अर्थ है । a, b
एक अभिव्यक्ति में दो चर का जिक्र होगा और मूल्यांकन किया जाएगा b
, जो कि ऐसा नहीं है var a, b
।
if (condition) var1 = val1, var2 = val2;
मुझे व्यक्तिगत रूप से लगता है कि कोष्ठक से बचना जहाँ संभव हो कोड को अधिक पठनीय बनाता है।
अल्पविराम ऑपरेटर आपको कई अभिव्यक्तियों को उस स्थान पर रखने की अनुमति देता है जहां एक अभिव्यक्ति की उम्मीद है। अल्पविराम द्वारा अलग किए गए कई अभिव्यक्तियों का परिणामी मूल्य अंतिम अल्पविराम से अलग अभिव्यक्ति का मूल्य होगा।
मैं व्यक्तिगत रूप से बहुत बार इसका उपयोग नहीं करता हूं क्योंकि ऐसी कई स्थितियां नहीं हैं जहां एक से अधिक अभिव्यक्ति की उम्मीद है और कॉमा ऑपरेटर का उपयोग करने की तुलना में कोड लिखने के लिए कम भ्रमित तरीका नहीं है। एक दिलचस्प संभावना एक for
लूप के अंत में है जब आप एक से अधिक वैरिएबल को बढ़ाना चाहते हैं:
// j is initialized to some other value
// as the for loop executes both i and j are incremented
// because the comma operator allows two statements to be put in place of one
for (var i = 0; i < items.len; i++, j++) {
// loop code here that operates on items[i]
// and sometimes uses j to access a different array
}
यहां आप देख i++, j++
सकते हैं कि ऐसी जगह पर रखा जा सकता है जहां एक अभिव्यक्ति की अनुमति है। इस विशेष मामले में, पक्ष के लिए कई अभिव्यक्तियों का उपयोग किया जाता है, इसलिए इससे कोई फर्क नहीं पड़ता है कि यौगिक अभिव्यक्तियां पिछले एक के मूल्य पर लेती हैं, लेकिन ऐसे अन्य मामले हैं जहां वास्तव में मामला हो सकता है।
जावास्क्रिप्ट में कार्यात्मक कोड लिखते समय कोमा ऑपरेटर अक्सर उपयोगी होता है।
इस कोड पर विचार करें जो मैंने थोड़ी देर पहले एसपीए के लिए लिखा था, जिसमें कुछ इस तरह था
const actions = _.chain(options)
.pairs() // 1
.filter(selectActions) // 2
.map(createActionPromise) // 3
.reduce((state, pair) => (state[pair[0]] = pair[1], state), {}) // 4
.value();
यह एक काफी जटिल, लेकिन वास्तविक दुनिया का परिदृश्य था। मेरे साथ सहन करें जबकि मैं समझाता हूं कि क्या हो रहा है, और इस प्रक्रिया में कॉमा ऑपरेटर के लिए मामला बनाते हैं।
इस फ़ंक्शन में दिए गए सभी विकल्पों को अलग से लें, pairs
जिनका उपयोग करके यह चालू { a: 1, b: 2}
हो जाएगा[['a', 1], ['b', 2]]
संपत्ति जोड़े के इस सरणी को फ़िल्टर किया जाता है जिसके द्वारा सिस्टम में 'कार्रवाई' मानी जाती है।
फिर एरे में दूसरे इंडेक्स को एक फ़ंक्शन से बदल दिया जाता है जो उस एक्शन का प्रतिनिधित्व करने वाले वादे का उपयोग करता है (उपयोग करते हुए map
)
अंत में कॉल करने के reduce
लिए प्रत्येक "संपत्ति सरणी" ( ['a', 1]
) एक अंतिम वस्तु में वापस विलय होगा ।
अंतिम परिणाम options
तर्क का एक रूपांतरित संस्करण है , जिसमें केवल उचित कुंजी होती है और जिसका मान कॉलिंग फ़ंक्शन द्वारा उपभोग्य होता है।
बस देख रहा हूं
.reduce((state, pair) => (state[pair[0]] = pair[1], state), {})
आप देख सकते हैं कि कम फ़ंक्शन एक खाली स्थिति ऑब्जेक्ट के साथ शुरू होता है state
, और प्रत्येक जोड़ी के लिए एक कुंजी और मूल्य का प्रतिनिधित्व करता है, फ़ंक्शन state
कुंजी / मूल्य जोड़ी के अनुरूप ऑब्जेक्ट में एक संपत्ति जोड़ने के बाद उसी ऑब्जेक्ट को वापस करता है । ECMAScript 2015 के तीर फ़ंक्शन सिंटैक्स के कारण, फ़ंक्शन बॉडी एक अभिव्यक्ति है, और परिणामस्वरूप, कॉमा ऑपरेटर एक संक्षिप्त और उपयोगी "पुनरावृति" फ़ंक्शन की अनुमति देता है ।
ECMAScript 2015 + एरो फ़ंक्शंस के साथ जावास्क्रिप्ट को और अधिक कार्यात्मक शैली में लिखते हुए व्यक्तिगत रूप से मैं कई मामलों में आया हूं। यह कहने के बाद कि, तीर फ़ंक्शन (जैसे प्रश्न के लेखन के समय) का सामना करने से पहले, मैंने कभी भी अल्पविराम तरीके से अल्पविराम ऑपरेटर का उपयोग नहीं किया।
reduce
.reduce((state, [key, value]) => (state[key] = value, state), {})
। और मुझे लगता है कि यह उत्तर के उद्देश्य को हरा देता है लेकिन .reduce((state, [key, value]) => Object.assign(state, { [key]: value }), {})
पूरी तरह से अल्पविराम ऑपरेटर की आवश्यकता को समाप्त कर देगा।
अल्पविराम ऑपरेटर के लिए एक अन्य उपयोग उन परिणामों को छिपाने के लिए है जो आप उत्तर या कंसोल के बारे में परवाह नहीं करते हैं, विशुद्ध रूप से एक सुविधा के रूप में।
उदाहरण के लिए, यदि आप उत्तर myVariable = aWholeLotOfText
या कंसोल में मूल्यांकन करते हैं, तो यह आपके द्वारा असाइन किए गए सभी डेटा को प्रिंट करेगा। यह पृष्ठ और पृष्ठ हो सकते हैं, और यदि आप इसे नहीं देखना पसंद करते हैं, तो आप इसके बजाय मूल्यांकन कर सकते हैं myVariable = aWholeLotOfText, 'done'
, और उत्तर / कंसोल बस 'किया' प्रिंट करेगा।
ओरिएल सही ढंग से † बताता है कि अनुकूलित toString()
या get()
फ़ंक्शंस भी इसे उपयोगी बना सकते हैं।
कोमा ऑपरेटर जावास्क्रिप्ट के लिए विशिष्ट नहीं है, यह सी और सी ++ जैसी अन्य भाषाओं में उपलब्ध है । एक बाइनरी ऑपरेटर के रूप में यह तब उपयोगी होता है जब पहला ऑपरेंड, जो आम तौर पर एक अभिव्यक्ति है, दूसरे ऑपरेंड द्वारा आवश्यक वांछित प्रभाव है। विकिपीडिया से एक उदाहरण:
i = a += 2, a + b;
जाहिर है आप दो अलग-अलग लाइनों के कोड लिख सकते हैं, लेकिन अल्पविराम का उपयोग करना एक और विकल्प है और कभी-कभी अधिक पठनीय है।
मैं फ़्लेगन से असहमत हूँ, और कहूँगा, कि अल्पविराम वास्तव में उपयोगी है और अधिक पठनीय और सुरुचिपूर्ण कोड लिखने की अनुमति देता है, खासकर जब आप जानते हैं कि आप क्या कर रहे हैं:
यहाँ अल्पविराम उपयोग पर बहुत विस्तृत लेख है :
प्रदर्शन के प्रमाण के लिए वहाँ से कई उदाहरण:
function renderCurve() {
for(var a = 1, b = 10; a*b; a++, b--) {
console.log(new Array(a*b).join('*'));
}
}
एक जेनरेटर जनरेटर:
for (
var i=2, r=[0,1];
i<15;
r.push(r[i-1] + r[i-2]), i++
);
// 0,1,1,2,3,5,8,13,21,34,55,89,144,233,377
पहला मूल तत्व खोजें, jQuery .parent()
फ़ंक्शन का एनालॉग :
function firstAncestor(el, tagName) {
while(el = el.parentNode, el && (el.tagName != tagName.toUpperCase()));
return el;
}
//element in http://ecma262-5.com/ELS5_HTML.htm
var a = $('Section_15.1.1.2');
firstAncestor(a, 'div'); //<div class="page">
while ((el = el.parentNode) && (el.tagName != tagName.toUpperCase()))
इस संदर्भ में यह ठीक रहेगा।
मुझे इसके अलावा इसका व्यावहारिक उपयोग नहीं मिला है, लेकिन यहां एक परिदृश्य है जिसमें जेम्स पोडल्से ने कुछ ही समय में IE का पता लगाने के लिए इस तकनीक का उपयोग किया है:
var ie = (function(){
var undef,
v = 3,
div = document.createElement('div'),
all = div.getElementsByTagName('i');
while ( // <-- notice no while body here
div.innerHTML = '<!--[if gt IE ' + (++v) + ']><i></i><![endif]-->',
all[0]
);
return v > 4 ? v : undef;
}());
इन दो लाइनों को निष्पादित करना होगा:
div.innerHTML = '<!--[if gt IE ' + (++v) + ']><i></i><![endif]-->',
all[0]
और कॉमा ऑपरेटर के अंदर, दोनों का मूल्यांकन किया जाता है, हालांकि कोई भी उन्हें किसी भी तरह से अलग बयान दे सकता है।
do
- while
पाश।
कुछ "विषम" है जो जावास्क्रिप्ट में किया जा सकता है एक फ़ंक्शन को अप्रत्यक्ष रूप से कॉमा ऑपरेटर का उपयोग करके बुलाता है।
यहां एक लंबा वर्णन है: जावास्क्रिप्ट में अप्रत्यक्ष फ़ंक्शन कॉल
इस सिंटैक्स का उपयोग करके:
(function() {
"use strict";
var global = (function () { return this || (1,eval)("this"); })();
console.log('Global === window should be true: ', global === window);
var not_global = (function () { return this })();
console.log('not_global === window should be false: ', not_global === window);
}());
आप वैश्विक वैरिएबल तक पहुंच प्राप्त कर सकते हैं क्योंकि eval
प्रत्यक्ष या अप्रत्यक्ष रूप से कहे जाने पर अलग-अलग तरीके से काम करता है।
मैंने इस तरह से हेल्पर्स लिखते समय अल्पविराम ऑपरेटर को सबसे उपयोगी पाया है।
const stopPropagation = event => (event.stopPropagation(), event);
const preventDefault = event => (event.preventDefault(), event);
const both = compose(stopPropagation, preventDefault);
आप अल्पविराम को या तो बदल सकते हैं || या &&, लेकिन तब आपको यह जानना होगा कि फ़ंक्शन क्या देता है।
उससे अधिक महत्वपूर्ण, अल्पविराम विभाजक इरादे का संचार करता है - कोड परवाह नहीं करता है कि बाएं-ऑपरेंड क्या मूल्यांकन करता है, जबकि विकल्प के पास होने का एक और कारण हो सकता है। यह बदले में समझने और रिफ्लेक्टर करने में आसान बनाता है। यदि फ़ंक्शन रिटर्न प्रकार कभी बदलता है, तो ऊपर दिया गया कोड प्रभावित नहीं होगा।
स्वाभाविक रूप से आप एक ही चीज़ को अन्य तरीकों से हासिल कर सकते हैं, लेकिन उतनी सहजता से नहीं। अगर || और && को सामान्य उपयोग में जगह मिली, इसलिए भी अल्पविराम ऑपरेटर कर सकता है।
tap
( ramdajs.com/docs/#tap ) के साथ ऐसा ही करता है । अनिवार्य रूप से, आप एक साइड-इफ़ेक्ट को निष्पादित कर रहे हैं और फिर प्रारंभिक मूल्य लौटा रहे हैं; कार्यात्मक प्रोग्रामिंग में बहुत उपयोगी है :)
एक विशिष्ट मामला जो मैं इसका उपयोग कर रहा हूं वह वैकल्पिक तर्क पार्सिंग के दौरान है। मुझे लगता है कि यह दोनों को अधिक पठनीय और अधिक संक्षिप्त बनाता है ताकि तर्क पार्सिंग फ़ंक्शन बॉडी पर हावी न हो।
/**
* @param {string} [str]
* @param {object} [obj]
* @param {Date} [date]
*/
function f(str, obj, date) {
// handle optional arguments
if (typeof str !== "string") date = obj, obj = str, str = "default";
if (obj instanceof Date) date = obj, obj = {};
if (!(date instanceof Date)) date = new Date();
// ...
}
मान लीजिए कि आपके पास एक सरणी है:
arr = [];
जब आप push
उस सरणी पर आते हैं, तो आप शायद ही कभी push
वापसी के मूल्य में रुचि रखते हैं , अर्थात् सरणी की नई लंबाई, बल्कि खुद सरणी:
arr.push('foo') // ['foo'] seems more interesting than 1
अल्पविराम ऑपरेटर का उपयोग करके, हम सरणी पर धक्का दे सकते हैं, सरणी को अंतिम ओपेरा के रूप में अल्पविराम तक निर्दिष्ट कर सकते हैं, और फिर परिणाम का उपयोग कर सकते हैं - बाद के सरणी विधि कॉल के लिए, सरणी - एक प्रकार की जंजीर:
(arr.push('bar'), arr.push('baz'), arr).sort(); // [ 'bar', 'baz', 'foo' ]
एक अन्य क्षेत्र जहां अल्पविराम ऑपरेटर का उपयोग किया जा सकता है, वह है कोड ऑब्सफिकेशन ।
मान लीजिए कि एक डेवलपर इस तरह से कुछ कोड लिखता है:
var foo = 'bar';
अब, वह कोड को बाधित करने का फैसला करती है। प्रयुक्त उपकरण इस तरह कोड को बदल सकता है:
var Z0b=(45,87)>(195,3)?'bar':(54,65)>(1,0)?'':'baz';// Z0b == 'bar'
var i, j, k;
बनामvar i; var j, var k
?