जावास्क्रिप्ट एक लाइन पर कई चर को कैसे परिभाषित किया जाए?


103

प्रलेखन ऑनलाइन पढ़ना, मैं उलझन में हूँ कि कैसे एक लाइन पर कई जावास्क्रिप्ट चर को ठीक से परिभाषित किया जाए।

अगर मैं निम्नलिखित कोड को संघनित करना चाहता हूं, तो एक ही लाइन पर कई जावास्क्रिप्ट चर को परिभाषित करने के लिए उचित जावास्क्रिप्ट "सख्त" तरीका क्या है?

var a = 0;
var b = 0;

क्या यह:

var a = b = 0;

या

var a = var b = 0; 

आदि...


1
एकाधिक असाइनमेंट पर अधिक: जावास्क्रिप्ट में चर असाइनमेंट कैसे काम करता है? । मैं इस पैटर्न को निर्माण कार्यों को उजागर करने के लिए एक बंद के अंदर उपयोगी var $cls = my.namespace.Foo = function(args){ ... }
पाता हूं

मुझे आश्चर्य है कि आप इसे पहले स्थान पर संघनित क्यों करना चाहते हैं। IMHO की घोषणा करना और एक के बाद एक वैरबल को असाइन करना बहुत स्पष्ट और किसी के लिए समझने में आसान है।
हेनिंग

जवाबों:


76

आप कॉमा पर भरोसा करना चाहते हैं क्योंकि यदि आप कई असाइनमेंट निर्माण पर भरोसा करते हैं, तो आप अपने आप को एक बिंदु या किसी अन्य पर पैर में गोली मार लेंगे।

एक उदाहरण होगा:

>>> var a = b = c = [];
>>> c.push(1)
[1]
>>> a
[1]

वे सभी स्मृति में एक ही वस्तु को संदर्भित करते हैं, वे "अद्वितीय" नहीं हैं क्योंकि जब भी आप किसी वस्तु (सरणी, वस्तु शाब्दिक, फ़ंक्शन) का संदर्भ बनाते हैं तो यह संदर्भ द्वारा पारित किया जाता है और मूल्य नहीं। इसलिए यदि आप उनमें से केवल एक चर को बदलते हैं, और चाहते थे कि आप व्यक्तिगत रूप से कार्य करें, तो आपको वह नहीं मिलेगा जो आप चाहते हैं क्योंकि वे व्यक्तिगत वस्तुएं नहीं हैं।

कई असाइनमेंट में एक नकारात्मक पहलू यह भी है, कि द्वितीयक चर ग्लोबल्स बन जाते हैं, और आप वैश्विक नामस्थान में लीक नहीं करना चाहते हैं।

(function() {  var a = global = 5 })();
alert(window.global) // 5

यह सिर्फ अल्पविराम और अधिमानतः कई व्हाट्सएप का उपयोग करना सबसे अच्छा है, इसलिए यह पठनीय है:

var a = 5
  , b = 2
  , c = 3
  , d = {}
  , e = [];

2
यह वास्तव में सामान्य रूप से सरणी संदर्भों को निर्दिष्ट करने के साथ एक मुद्दा है, न कि केवल मानों के रूप में असाइनमेंट स्टेटमेंट के साथ।
मैथ्यू फ्लेशेन

"इसलिए जब आप संख्यात्मक शाब्दिक चीज़ों के लिए कई दाहिने हाथ के असाइनमेंट के साथ दूर हो सकते हैं"
मध्य पूर्व

1
@meder, यह किसी भी असाइनमेंट के साथ एक समस्या है। दाहिने हाथ के बारे में कुछ खास नहीं है।
मैथ्यू फ्लेशेन

मेरा मतलब था सामान्य तौर पर असाइनमेंट। शब्द का संपादन।
पदक विजेता

2
इस कई असाइनमेंट पैटर्न के साथ ध्यान में रखने वाली बात यह है कि ES5 स्ट्रिक्ट मोड के तहत कोई भी अघोषित असाइनमेंट, एक ReferenceErrorअपवाद का कारण होगा ... IMO, उन्हें टाला जाना चाहिए ...
CMS

64

जावास्क्रिप्ट का es6 या नोड का उपयोग करके, आप निम्न कार्य कर सकते हैं:

var [a,b,c,d] = [0,1,2,3]

और यदि आप आसानी से एक ही पंक्ति में कई चर प्रिंट करना चाहते हैं, तो बस यह करें:

console.log(a, b, c, d)

0 1 2 3

यह यहाँ @alex ग्रे के उत्तर के समान है, लेकिन यह उदाहरण कॉफीस्क्रिप्ट के बजाय जावास्क्रिप्ट में है।

ध्यान दें कि यह जावास्क्रिप्ट के एरो विनाशकारी असाइनमेंट का उपयोग करता है


2
console.log(a,b,c,d)बजाय इस मामले में उपयोग क्यों नहीं ? यह छोटा है और एक ही आउटपुट देता है
जोश ब्रॉडहर्स्ट

44

मान के रूप में असाइनमेंट के साथ इसे एक पंक्ति में करने का कोई तरीका नहीं है।

var a = b = 0;

वैश्विक बनाता है। एक सही तरीका (चरों को लीक किए बिना) थोड़ा लंबा है:

var a = 0, b = a;

जो मामले में उपयोगी है:

var a = <someLargeExpressionHere>, b = a, c = a, d = a;

1
"दोहराए बिना मान के रूप में असाइनमेंट का उपयोग करने का कोई तरीका नहीं है।" - आपका मतलब क्या है?
palswim

28

दो लाइनों में क्यों नहीं कर रहा है?

var a, b, c, d;    // All in the same scope
a = b = c = d = 1; // Set value to all.

कारण, चर घोषणाओं पर स्थानीय गुंजाइश को संरक्षित करना है, इस प्रकार है:

var a = b = c = d = 1;

के अंतर्निहित घोषणाओं को बढ़ावा मिलेगा b, cऔर dखिड़की गुंजाइश पर।


यह मेरे लिए उपयोगी था क्योंकि मैं अपने कार्यक्रम में कई तरह के बदलावों की घोषणा करता हूं। अब, मैं 30+ लाइनें लेने के बजाय पठनीयता का त्याग किए बिना कुछ पंक्तियों का उपयोग कर सकता हूं।
कालिफ वॉन

11

यहाँ एक पंक्ति में कई चर घोषित करने की नई ES6 विधि है:

const person = { name: 'Prince', age: 22, id: 1 };

let {name, age, id} = person;

console.log(name);
console.log(age);
console.log(id);

* आपका चर नाम और ऑब्जेक्ट इंडेक्स समान होना चाहिए


2
यह ओपी के प्रश्न से अधिक लंबा है, क्योंकि यह इसके बराबर है let { a, b } = { a: 0, b: 0 }
डैन डस्केल्सस्कु

4

विशेष रूप से ओपी ने जो पूछा है, यदि आप उसी मूल्य (उदाहरण 0) के साथ एन वेरिएबल्स को इनिशियलाइज़ करना चाहते हैं, तो आप एन डिस्ट्रिब्यूशन के एरे को असाइन करने के लिए एरे विनाशकारी और अर्रे.फिल का उपयोग कर सकते हैं 0:

let [a, b, c, d] = Array(4).fill(0);

console.log(a, b, c, d);


0

ध्यान दें कि आप केवल संख्या और स्ट्रिंग्स के साथ ही ऐसा कर सकते हैं

तुम यह कर सकते थे...

var a, b, c; a = b = c = 0; //but why?

c++;
// c = 1, b = 0, a = 0;
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.