जावास्क्रिप्ट में एक ही मान के लिए कई चर असाइन करें


177

मैंने एक जावास्क्रिप्ट फ़ाइल में वैश्विक दायरे में कई वेरिएबल्स को इनिशियलाइज़ किया है:

var moveUp, moveDown, moveLeft, moveRight;
var mouseDown, touchDown;

मुझे इन सभी चरों को झूठे पर सेट करने की आवश्यकता है, यह वह कोड है जो वर्तमान में मेरे पास है:

moveUp    = false;
moveDown  = false;
moveLeft  = false;
moveRight = false
mouseDown = false;
touchDown = false;

क्या कोई तरीका है कि मैं इन सभी चर को कोड की एक पंक्ति में एक ही मूल्य पर सेट कर सकता हूं, या क्या वर्तमान में मेरे पास ऐसा करने का सबसे अच्छा तरीका है


8
सभी पाठकों: कृपया अपने कोड में शीर्ष उत्तर को लागू करने का निर्णय लेने से पहले नीचे दिए गए दूसरे उत्तर को देखें। शांति।
गोविंद राय १

ऐसा करने का प्रयास न करें, क्योंकि स्मृति में केवल एक चर होगा और दूसरे उस एक के लिए एक प्रति या संदर्भ होंगे, फिर यदि आप सभी से मान बदलते हैं तो प्रभावित होगा
लुकास माटोस

@LucasMatos आदिम के लिए नहीं।
डेव न्यूटन

जवाबों:


290

कुछ भी करने से रोकता है

moveUp = moveDown = moveLeft = moveRight = mouseDown = touchDown = false;

इस उदाहरण की जाँच करें

var a, b, c;
a = b = c = 10;
console.log(a + b + c)


13
आप टिप्पणी करना चाहते हैं कि जब आप सुझाव देते हैं, तो मूल्यों को व्यवहार करने के तरीके और संदर्भ प्रकार भिन्न होंगे।
स्टीवन वेक्सलर

26
हाँ, यदि किसी वस्तु के साथ ऐसा किया जाता है, तो सभी चर वस्तु के उपनाम होंगे। IE संपत्ति में function MyObj(){this.x=1} var a,b; a = b = new MyObj(); ++a.xवृद्धि भी करेगा b.x
एलेक्समर्ले-फिंच

27
स्कोपिंग की समस्या! stackoverflow.com/questions/1758576/…
डबलजॉश

4
मैं कहूंगा कि इस दृष्टिकोण का उपयोग न करें यदि आप विश्व स्तर पर असाइनमेंट के बाईं ओर सभी वेरिएबल्स को स्कूप नहीं कर रहे हैं
नागरिक कांग्रेस

2
जैसा कि @doublejosh ने कहा, ऐसी स्कूपिंग समस्याएं हैं जिन्हें आपने संबोधित नहीं किया है।
7

90

कुछ भी नहीं आपको ऊपर करने से रोकता है, लेकिन पकड़ो!

कुछ गोत्र हैं। जब आप लिखते हैं तो जावास्क्रिप्ट से असाइनमेंट दाईं से बाईं ओर होता है:

var moveUp = moveDown = moveLeft = moveRight = mouseDown = touchDown = false;

यह प्रभावी रूप से अनुवाद करता है:

var moveUp = (moveDown = (moveLeft = (moveRight = (mouseDown = (touchDown = false)))));

जो प्रभावी रूप से अनुवाद करता है:

var moveUp = (window.moveDown = (window.moveLeft = (window.moveRight = (window.mouseDown = (window.touchDown = false)))));

अनजाने में, आपने अभी 5 वैश्विक चर बनाए हैं - कुछ ऐसा जो मुझे यकीन है कि आप करना नहीं चाहते हैं।

नोट: मेरा उपरोक्त उदाहरण मानता है कि आप ब्राउज़र में अपना कोड चला रहे हैं, इसलिए window। यदि आप एक अलग वातावरण में होते तो ये चर उस पर्यावरण के लिए जो भी वैश्विक संदर्भ होता है (यानी, Node.js में, यह globalउस पर्यावरण के लिए वैश्विक संदर्भ होता है) के साथ संलग्न होता ।

अब आप पहले अपने सभी चर घोषित कर सकते हैं और फिर उन्हें उसी मूल्य पर असाइन कर सकते हैं और आप समस्या से बच सकते हैं।

var moveUp, moveDown, moveLeft, moveRight, mouseDown, touchDown;
moveUp = moveDown = moveLeft = moveRight = mouseDown = touchDown = false;

लंबी कहानी छोटी, दोनों तरीके बस ठीक काम करेंगे, लेकिन पहला तरीका संभवतः आपके कोड में कुछ खतरनाक कीड़े पेश कर सकता है। यदि आवश्यक नहीं है तो स्थानीय चर के साथ वैश्विक नाम स्थान को गंदे करने का पाप न करें।


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


2
क्या होगा अगर हम ऐसा ही करते हैं?
पी-राड

moveUpब्लॉक-स्कोप बनने के अलावा , इससे कोई फर्क नहीं पड़ेगा। 5 वैश्विक चर अभी भी घोषित किए जाएंगे।
गोविंद राय

1
@ गोविंदराय इससे var a, b, c; a = b = c = 10;बहुत अलग हैं var a = b = c = 10;। तो, स्वीकृत उत्तर सही है। आप एक समस्या को स्वीकार कर रहे हैं जो स्वीकृत उत्तर से संबंधित नहीं है।
एलिस ब्य्बेरि

1
@ElisByberi आपकी टिप्पणी के लिए धन्यवाद। तुम गलत नहीं हो। मेरे उत्तर का लक्ष्य स्वीकृत उत्तर में पहले वाक्य को संबोधित करना था। मैंने उस संबंध में अपने उत्तर में और स्पष्टता प्रदान की है।
गोविंद राय

1
@ पी-रेड केवल पहले ही घोषित किए गए वैरिएबल का उपयोग करते हुए एनक्लोजिंग स्कोप में मौजूद होगा।
उदय हिरवाले

9

एक और विकल्प है जो एक ही मूल्य के लिए कई चर शुरू करने की कोशिश करते समय वैश्विक गोचरों को पेश नहीं करता है। यह निर्णय लेने के लिए लंबा रास्ता तय करना बेहतर है या नहीं। यह संभवतः धीमा होगा और अधिक पठनीय हो सकता है या नहीं भी हो सकता है। आपके विशिष्ट मामले में, मुझे लगता है कि लंबा रास्ता संभवत: अधिक पठनीय और रखरखाव योग्य होने के साथ-साथ तेज भी है।

अन्य तरीका का इस्तेमाल Destructuring काम

let [moveUp, moveDown,
     moveLeft, moveRight,
     mouseDown, touchDown] = Array(6).fill(false);

console.log(JSON.stringify({
    moveUp, moveDown,
    moveLeft, moveRight,
    mouseDown, touchDown
}, null, '  '));

// NOTE: If you want to do this with objects, you would be safer doing this
let [obj1, obj2, obj3] = Array(3).fill(null).map(() => ({}));
console.log(JSON.stringify({
    obj1, obj2, obj3
}, null, '  '));
// So that each array element is a unique object

// Or another cool trick would be to use an infinite generator
let [a, b, c, d] = (function*() { while (true) yield {x: 0, y: 0} })();
console.log(JSON.stringify({
    a, b, c, d
}, null, '  '));

// Or generic fixed generator function
function* nTimes(n, f) {
    for(let i = 0; i < n; i++) {
        yield f();
    }
}
let [p1, p2, p3] = [...nTimes(3, () => ({ x: 0, y: 0 }))];
console.log(JSON.stringify({
    p1, p2, p3
}, null, '  '));

यह आपको का एक सेट प्रारंभ करने की अनुमति देता है var, letया constसभी एक ही उम्मीद गुंजाइश के साथ एक पंक्ति पर एक ही मूल्य के लिए चर।

संदर्भ:


1
हालांकि, खबरदार। यदि इस विधि का उपयोग करके कई चर के लिए ऑब्जेक्ट, फ़ंक्शन, या सरणियाँ निर्दिष्ट की जाती हैं, तो प्रत्येक चर sameऑब्जेक्ट के लिए एक अन्य नाम होगा । एक में संशोधन दूसरों को प्रभावित करेगा ...
डग कोबर्न

-6

वेरिएबल को एक अरै में रखें और एक से अधिक वेरिएबल्स में समान मान असाइन करने के लिए लूप के लिए उपयोग करें।

  myArray[moveUP, moveDown, moveLeft];

    for(var i = 0; i < myArray.length; i++){

        myArray[i] = true;

    }

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