জাভাস্ক্রিপ্টের সাথে একাধিক বাম-হাতের অ্যাসাইনমেন্ট


186
var var1 = 1,
    var2 = 1,
    var3 = 1;

এটি এর সমতুল্য:

var var1 = var2 = var3 = 1;

আমি মোটামুটি নিশ্চিত যে এটি ভেরিয়েবলগুলি সংজ্ঞায়িত করার ক্রম: var3, var2, var1 যা এর সমতুল্য হবে:

var var3 = 1, var2 = var3, var1 = var2;

জাভাস্ক্রিপ্টে এটি নিশ্চিত করার কোনও উপায় আছে কি? কিছু প্রোফাইলার সম্ভবত ব্যবহার করছেন?



আমি ব্যবহার করলে এটি কি প্রযোজ্য this.var1 = this.var2 = this.var3 = 1?
গঙ্গাধর জেন্নু

উত্তর:


404

আসলে,

var var1 = 1, var2 = 1, var3 = 1;

এর সমতুল্য নয় :

var var1 = var2 = var3 = 1;

পার্থক্যটি স্কোপিংয়ের মধ্যে রয়েছে:

function good() {
  var var1 = 1, var2 = 1, var3 = 1;
}

function bad() {
  var var1 = var2 = var3 = 1;
}

good();
console.log(window.var2); // undefined

bad();
console.log(window.var2); // 1. Aggh!

আসলে এটি দেখায় যে অ্যাসাইনমেন্টটি সঠিক সংঘবদ্ধ ia badউদাহরণস্বরূপ সমতূল্য:

var var1 = (window.var2 = (window.var3 = 1));

44
ডাং, এটি অপ্রত্যাশিত। টিপটির জন্য ধন্যবাদ, আমি এটির জন্য নজর রাখব।
ডেভিড ক্যালহাউন

10
@ স্কিনিজি 33 কে কারণ এটি ডান থেকে বামে। সুতরাং এটি বামে সবচেয়ে আগে ডানটিকে বিশ্লেষণ করবে। সুতরাং var var1=var2পরে var3 = 1এবং পরে ঘটে var2 = var3। এটি এর মতvar3=1; var2=var3; var var1=var2
gcb

12
কেবলমাত্র লক্ষণীয়: আপনি যদি জানেন যে আপনি এই ধরণের কাজটি আগেই করতে চান তবে আপনি অ্যাসাইনমেন্ট থেকে সংজ্ঞাটি ভেঙে ফেলতে পারেন। সুতরাং: var v1, v2, v3;তারপরে পরে: v1 = v2 = v3 = 6;তারা এখনও স্থানীয় স্কোপে থাকবে। যেহেতু ডেভিড সতর্কতাগুলির উল্লেখ করেছে, এটি প্রত্যাশার মতো কাজ করবে (যদি প্রাক-বর্ণ'দ হয়):alert(v1 = v2 = v3 = 6);
শানফুমো

3
যথাযথভাবে। তবে আমরা যদি কিছু সাধারণ সেরা অনুশীলন অনুসরণ করি তবে এক্ষেত্রে আমাদের ভেরিয়েবলগুলি শীর্ষে ঘোষণা করে আমরা অযাচিত ভুল থেকে রক্ষা করতে পারি এবং স্থানীয় ভেরিয়েবলগুলি বিশ্বব্যাপী ফাঁস হওয়া এড়াতে পারি। : দেখুন jsfiddle.net/gleezer/r9Mu8/1
Nobita

1
"ডাং, এটাই অপ্রত্যাশিত।" কেন এটি অপ্রত্যাশিত হবে? বেশিরভাগ ভাষাগুলির ব্যবহারের আগে আপনাকে আপনার ভেরিয়েবলগুলি ঘোষণা করতে হবে। জাভাস্ক্রিপ্ট আলাদা নয়, আপনি যদি নিজের ভেরিয়েবলটিকে ঘোষণা করতে অবহেলা করেন তবে এটি বৈশ্বিক উইন্ডো অবজেক্টের ডিফল্ট। আপনার জাভাস্ক্রিপ্টে 'ব্যবহার কঠোর' ব্যবহার শুরু করুন এবং আপনি আরও ভাল জাভাস্ক্রিপ্ট প্রোগ্রামার হয়ে উঠবেন।
চেম্বারলাইন

19

জাভাস্ক্রিপ্টে অ্যাসাইনমেন্ট ডান থেকে বামে কাজ করে। var var1 = var2 = var3 = 1;

যদি এই ভেরিয়েবলের কোনওটির মান 1এই বিবৃতিটির পরে হয়, তবে যৌক্তিকভাবে এটি অবশ্যই ডান থেকে শুরু হওয়া উচিত, অন্যথায় মান বা var1এবং অপরিবর্তিত var2হবে।

আপনি এটি var var1 = (var2 = (var3 = 1));প্রথম যেখানে প্রথম বন্ধনীর অভ্যন্তরের সবচেয়ে সেট নির্ধারণ করা হয় সমান হিসাবে ভাবতে পারেন ।


1
ধন্যবাদ, এটি অবশ্যই সহায়তা করে। এটি ডান থেকে বাম ছাড়া অন্য মূল্যায়ন করা হলে কোন ত্রুটি নিক্ষেপ করা হবে তার পদক্ষেপে ভাবতে সহায়তা করে (এই ক্ষেত্রে ত্রুটিটি হ'ল যে var1 / var2 অপরিজ্ঞাত)।
ডেভিড Calhoun

5
এটি আসলে একটি বাক্য গঠন ত্রুটি। আপনি (অবিলম্বে পরে থাকতে পারে না var। প্রথম বন্ধনী বাইরের সেট সরানো হচ্ছে, এটা ত্রুটি ছাড়া কম্পাইল করার অনুমতি দেয় var var1 = (var2 = (var3 = 1));। সেই সময় আমি অনুভব করেছি যে এটি বিন্দুটি বেশ ভালভাবে চিত্রিত করে না তবে আমি মনে করি এটি একইরকম।
জাস্টিন জনসন

var var1 = var2 = var3 = 1;. সমান var var3 = 1; var var2 = var3; var var1 = var2;
xgqfrms

8

var var1 = 1, var2 = 1, var3 = 1;

varএক্ষেত্রে তিনটি ভেরিয়েবলের ক্ষেত্রে কীওয়ার্ড প্রযোজ্য।

var var1 = 1,
    var2 = 1,
    var3 = 1;

যা এর সমান নয়:

var var1 = var2 = var3 = 1;

এই ক্ষেত্রে পর্দার পিছনে varকীওয়ার্ডটি কেবলমাত্র var1পরিবর্তনশীল উত্তোলনের কারণে প্রযোজ্য এবং বাকী বাক্যটি সাধারণত মূল্যায়ন করা হয় যাতে ভেরিয়েবলগুলি বিশ্বব্যাপীvar2, var3 হয়ে উঠছে

জাভাস্ক্রিপ্ট এই কোডটি এই ক্রমে আচরণ করে:

/*
var 1 is local to the particular scope because of var keyword
var2 and var3 will become globals because they've used without var keyword
*/

var var1;   //only variable declarations will be hoisted.

var1= var2= var3 = 1; 

8
a = (b = 'string is truthy'); // b gets string; a gets b, which is a primitive (copy)
a = (b = { c: 'yes' }); // they point to the same object; a === b (not a copy)

(a && b)যৌক্তিকভাবে (a ? b : a)এবং গুণকের মতো আচরণ করে (উদাঃ !!a * !!b)

(a || b)যৌক্তিকভাবে (a ? a : b)এবং সংযোজনের মতো আচরণ করে (উদাঃ !!a + !!b)

(a = 0, b)যত্নবান না করার জন্য সংক্ষিপ্ত যদি aসত্যবাদী হয়, স্পষ্টভাবে ফিরে আসেb


a = (b = 0) && "nope, but a is 0 and b is 0"; // b is falsey + order of operations
a = (b = "b is this string") && "a gets this string"; // b is truthy + order of ops

জাভাস্ক্রিপ্ট অপারেটর অগ্রাধিকার (পরিচালনা আদেশ)

নোট করুন যে কমা অপারেটরটি আসলে সর্বনিম্ন সুবিধাযুক্ত অপারেটর, তবে প্রথম বন্ধনী সবচেয়ে বেশি সুবিধাযুক্ত এবং এক-লাইন এক্সপ্রেশন তৈরি করার সময় এগুলি হাতছাড়া হয়।


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

const windowInnerHeight = () => 0.8 * window.innerHeight; // a thunk

windowInnerHeight(); // a thunk

4

এটা চেষ্টা কর:

var var1=42;
var var2;

alert(var2 = var1); //show result of assignment expression is assigned value
alert(var2); // show assignment did occur.

প্রথম সতর্কতায় একক '=' নোট করুন। এটি দেখায় যে কোনও অ্যাসাইনমেন্ট এক্সপ্রেশনের ফলাফল নির্ধারিত মান, এবং ২ য় সতর্কতা আপনাকে দেখায় যে অ্যাসাইনমেন্টটি ঘটেছে।

এটি যৌক্তিকভাবে অনুসরণ করে যে অ্যাসাইনমেন্টটি ডান থেকে বামে আবদ্ধ থাকতে হবে। তবে, যেহেতু এটি জাভাস্ক্রিপ্টের সমস্ত পারমাণবিক (কোনও থ্রেডিং নেই) কোনও নির্দিষ্ট ইঞ্জিন আসলে এটি অন্যরকমভাবে আরও অনুকূল করতে পছন্দ করতে পারে।


1
উত্তর করার জন্য ধন্যবাদ. আমি মনে করি আমি একাধিক-অ্যাসাইনমেন্ট কাঠামো (a = b = c) বজায় রেখে সতর্কতাগুলি ব্যবহার করার উপায় খুঁজছিলাম, তবে আমি মনে করি এটি সম্ভব নয়।
ডেভিড ক্যালহাউন

1
জাভাস্ক্রিপ্টে এই জাতীয় স্বতন্ত্র বক্তব্যগুলি (এবং একাধিক বক্তব্য, যদিও সমস্ত একক বিবৃতিতে কাজ করে) পারমাণবিক হিসাবে বিবেচিত হতে পারে। আপনাকে এটি ভেঙে ফেলতে হবে।
জোয়েল কোহোর্ন

1

এটি এখনই পরিষ্কার হয়ে গেছে যে তারা এক নয়। কোড করার উপায় এটি

var var1, var2, var3
var1 = var2 = var3 = 1

এবং, কী দায়িত্ব সম্পর্কে? হ'ল ভারের মতোই, ব্লক স্কোপের কারণে অ্যাসিগমেন্টটি আপনাকে বিভ্রান্ত করতে দেবেন না।

let var1 = var2 = 1 // here var2 belong to the global scope

আমরা নিম্নলিখিতগুলি করতে পারি:

let v1, v2, v3
v1 = v2 = v3 = 2

দ্রষ্টব্য: বিটিডব্লিউ, আমি একাধিক অ্যাসাইনমেন্ট ব্যবহার করার পরামর্শ দিচ্ছি না, একই লাইনে একাধিক ঘোষণাও নয়।


-3

coffee-script অ্যাপলম্ব দিয়ে এটি সম্পাদন করতে পারে ..

for x in [ 'a', 'b', 'c' ] then "#{x}" : true

[ { a: true }, { b: true }, { c: true } ]


7
এটি আসলে প্রশ্নের উত্তর দেয় না। প্রশ্নটি আবার পড়ুন।
মার্টিন

30
কে কফিস্ক্রিপ্ট সম্পর্কে যত্নশীল
নিউউউজিক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.