জাভাস্ক্রিপ্টে একই মানটিতে একাধিক ভেরিয়েবল বরাদ্দ করুন


177

আমি একটি জাভাস্ক্রিপ্ট ফাইলে বৈশ্বিক স্কোপগুলিতে বেশ কয়েকটি ভেরিয়েবল শুরু করেছি:

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

আমাকে এই ভেরিয়েবলের সমস্তটি মিথ্যাতে সেট করতে হবে, আমার কাছে বর্তমানে এই কোডটি রয়েছে:

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

কোডের এক লাইনে এই ভেরিয়েবলগুলিকে একই মান হিসাবে সেট করতে পারি এমন কোনও উপায় আছে বা আমার কাছে বর্তমানে কোডটি করার পক্ষে সর্বোত্তম উপায় আছে?


8
সমস্ত পাঠক: আপনি আপনার কোডটিতে শীর্ষ উত্তরটি প্রয়োগ করার সিদ্ধান্ত নেওয়ার আগে দয়া করে নীচের দ্বিতীয় উত্তরটি দেখুন। শান্তি বর্ষিত হোক।
গোবিন্দ রায়

এটি করার চেষ্টা করবেন না, কারণ স্মৃতিতে কেবল একটি পরিবর্তনশীল হবে এবং অন্যরা সেইটির জন্য অনুলিপি বা রেফারেন্স হয়ে উঠবে, তারপরে আপনি যদি একটি থেকে মান পরিবর্তন করেন তবে তার প্রভাব পড়বে
লুকাশ মাতোস

@ লুকাসম্যাটোস আদিমদের জন্য নয়।
ডেভ নিউটন

উত্তর:


290

কিছুই আপনাকে করতে বাধা দেয় না

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

এই উদাহরণটি পরীক্ষা করুন

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


13
আপনি যেভাবে মূল্যবোধটি প্রস্তাব করেন সেভাবে আচরণটি কীভাবে আদিম ধরণের এবং রেফারেন্সের ধরণের মধ্যে আলাদা হবে তা আপনি মন্তব্য করতে চাইতে পারেন।
স্টিভেন ওয়েক্সলার

26
হ্যাঁ, এটি যদি কোনও বস্তুর সাথে করা হয় তবে সমস্ত ভেরিয়েবলগুলি বস্তুর উপকরণ হবে। আইই সম্পত্তি function MyObj(){this.x=1} var a,b; a = b = new MyObj(); ++a.xবৃদ্ধি করবে b.x
অ্যালেক্সমারলি-ফিঞ্চ

27
স্কোপিংয়ের সমস্যা! stackoverflow.com/questions/1758576/...
doublejosh

4
আমি বলব যদি আপনি বিশ্বব্যাপী অ্যাসাইনমেন্টের বাম দিকের সমস্ত ভেরিয়েবলগুলি স্কোপ না করে থাকেন তবে এই পদ্ধতিটি ব্যবহার করবেন না
নাগরিক সংযুক্ত

2
@ ডাবলজোশ যেমন বলেছিলেন, এমন স্কোপিং সমস্যা রয়েছে যা আপনি সমাধান করেন নি।
kstratis

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। আপনি যদি অন্য কোনও পরিবেশে থাকতেন তবে এই পরিবর্তনগুলি সেই পরিবেশের জন্য বিশ্বব্যাপী প্রসঙ্গটি যা ঘটবে তা সংযুক্ত করবে (যেমন, নোড.জেজে, এটি সংযুক্ত হবে)global সেই পরিবেশের জন্য বৈশ্বিক প্রেক্ষাপট যা )।

এখন আপনি প্রথমে আপনার সমস্ত ভেরিয়েবলগুলি ঘোষণা করতে পারেন এবং তারপরে সেগুলি একই মান হিসাবে নির্ধারণ করতে পারেন এবং আপনি সমস্যা এড়াতে পারেন।

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

দীর্ঘ গল্প সংক্ষিপ্ত, উভয় উপায়ে ঠিক কাজ করবে, তবে প্রথম উপায়টি সম্ভবত আপনার কোডে কিছু ক্ষতিকারক বাগ প্রবর্তন করতে পারে। গ্লোবাল নেমস্পেসের স্থানীয় ভেরিয়েবলগুলির সাথে লিটারে পাপ করবেন না যদি একেবারে প্রয়োজনীয় না হয়।


সিডিনোট: মন্তব্যগুলিতে যেমন উল্লেখ করা হয়েছে (এবং এটি কেবল এই প্রশ্নের ক্ষেত্রে নয়) তবে যদি প্রশ্নের অনুলিপি করা মান কোনও আদিম মান না হয়ে পরিবর্তে কোনও বস্তু ছিল তবে আপনি রেফারেন্স দ্বারা মান বনাম অনুলিপি দ্বারা অনুলিপি সম্পর্কে আরও ভাল জানেন know যখনই অবজেক্টগুলি বরাদ্দ করা হয় তখন অবজেক্টের রেফারেন্সটি আসল বস্তুর পরিবর্তে অনুলিপি করা হয়। সমস্ত ভেরিয়েবলগুলি একই পদার্থের দিকে ইঙ্গিত করবে তাই একটি ভেরিয়েবলের যে কোনও পরিবর্তন অন্য ভেরিয়েবলগুলিতে প্রতিফলিত হবে এবং যদি আপনার উদ্দেশ্য উদ্দেশ্যটির অনুলিপিটি নয়, তবে রেফারেন্সটি নয় তবে আপনাকে বড় মাথাব্যথার কারণ করে।


2
যদি আমরা এই একই কাজ করা যাক?
পি-আরএড

moveUpব্লক-স্কোপড হয়ে ওঠার পাশাপাশি , এতে কোনও পার্থক্য নেই। 5 টি বৈশ্বিক চলক এখনও ঘোষিত হবে।
গোবিন্দ রায়

1
@ গোবিন্দরাই এর var a, b, c; a = b = c = 10;থেকে আলাদা var a = b = c = 10;। সুতরাং, গৃহীত উত্তরটি সঠিক। আপনি কোনও সমস্যার সমাধান করছেন যা গৃহীত উত্তরের সাথে সম্পর্কিত নয়।
এলিস বাইবেরি

1
@ এলিসবাইবারি আপনার মন্তব্যের জন্য ধন্যবাদ। তুমি ভুল না. আমার উত্তরের লক্ষ্য ছিল গ্রহণযোগ্য উত্তরের প্রথম বাক্যটি সম্বোধন করা। আমি এই বিষয়ে আমার উত্তরটিতে আরও স্পষ্টতা দিয়েছি।
গোবিন্দ রায়

1
@ পি-আরএড ব্যবহারের মাধ্যমে ঘোষিত প্রথম পরিবর্তনশীলটি বদ্ধ করার সুযোগে উপস্থিত থাকবে in
উদয় হিওরালে

9

একই বিকল্পে একাধিক ভেরিয়েবল আরম্ভ করার চেষ্টা করার সময় আরও একটি বিকল্প রয়েছে যা বৈশ্বিক গোটচগুলি প্রবর্তন করে না। দীর্ঘ পথের চেয়ে এটি অগ্রাধিকারযোগ্য কিনা তা রায় ঘোষণা। এটি সম্ভবত ধীর হতে পারে এবং আরও পঠনযোগ্যও হতে পারে। আপনার নির্দিষ্ট ক্ষেত্রে, আমি মনে করি যে দীর্ঘতম পথটি সম্ভবত আরও পঠনযোগ্য এবং বজায় রাখার পাশাপাশি দ্রুত হওয়ার জন্য।

অন্যান্য উপায় সদ্ব্যবহার ডেসট্রাকচারিং অ্যাসাইনমেন্ট

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
এটি খুব ভুল first
undefinederror
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.