जावास्क्रिप्ट के साथ एकाधिक बाएँ हाथ असाइनमेंट


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

यह इसके बराबर है:

var var1 = var2 = var3 = 1;

मैं काफी निश्चित हूं कि यह वह क्रम है जिससे चर परिभाषित किए जाते हैं: var3, var2, var1, जो इसके बराबर होगा:

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

क्या जावास्क्रिप्ट में इसकी पुष्टि करने का कोई तरीका है? संभवतः कुछ प्रोफाइलर का उपयोग करना?


6
ASSIGNMENT बाएं से दाएं होता जावास्क्रिप्ट ऑपरेटर पूर्वता
neaumusic

अगर मैं उपयोग करता हूं तो क्या यह लागू है 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!

वास्तव में यह दर्शाता है कि असाइनमेंट सही सहयोगी है। badउदाहरण के बराबर है:

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

44
डांग, यह अप्रत्याशित है। टिप के लिए धन्यवाद, मैं उसके लिए देखूंगा।
डेविड कैलहॉन

10
@ SkinnyG33k क्योंकि यह बाएँ से दाएँ है। इसलिए यह सबसे बाईं ओर से पहले दाईं ओर पार्स करेगा। तो 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);
ShawnFumo

3
बिल्कुल सही। लेकिन अगर हम कुछ सामान्य सर्वोत्तम प्रथाओं का पालन करते हैं, तो इस मामले में हमारे चर को शीर्ष पर घोषित करके हम अवांछित गलतियों से बच सकते हैं और वैश्विक चर पर लीक होने वाले स्थानीय चर से बच सकते हैं। देखें: jsfiddle.net/gleezer/r9Mu8/1
नोबिता

1
"डांग, यह अप्रत्याशित है।" यह अप्रत्याशित क्यों होगा? अधिकांश भाषाओं में आपको उपयोग से पहले अपने चर घोषित करने की आवश्यकता होती है। जावास्क्रिप्ट अलग नहीं है, अगर आप अपने चर को घोषित करने की उपेक्षा करते हैं, तो यह वैश्विक विंडो ऑब्जेक्ट में चूक करता है। अपनी जावास्क्रिप्ट में 'स्ट्रिक्ट यूज़' का उपयोग करना शुरू करें और आप एक बेहतर जावास्क्रिप्ट प्रोग्रामर बन जाएंगे।
cchamberlain

19

जावास्क्रिप्ट में असाइनमेंट दाईं से बाईं ओर काम करता है। var var1 = var2 = var3 = 1;

इनके किसी भी मूल्य है 1इस बयान के बाद, तो तार्किक रूप से यह सही से, शुरू हो गया होगा अन्यथा मूल्य या var1और var2अपरिभाषित किया जाएगा।

आप इसे var var1 = (var2 = (var3 = 1));उसी के बराबर मान सकते हैं, जहाँ सबसे पहले कोष्ठक के आंतरिक-सेट का मूल्यांकन किया जाता है।


1
धन्यवाद, यह निश्चित रूप से मदद करता है। यह सोचने में मदद करता है कि क्या त्रुटियों को फेंक दिया जाएगा यदि इसका मूल्यांकन दाएं-से-बाएं के अलावा किया गया था (इस मामले में, त्रुटि यह होगी कि var1 / var2 अपरिभाषित हैं)।
डेविड कैलहॉन

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

ध्यान दें: btw, मैं एक ही पंक्ति में कई घोषणाओं का उपयोग नहीं करने की सलाह नहीं देता।


-3

coffee-script aplomb के साथ यह पूरा कर सकते हैं ..

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

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


7
यह वास्तव में सवाल का जवाब नहीं देता है। कृपया प्रश्न को पुनः पढ़ें।
मार्टिन

30
जो कॉफ़ी के बारे में परवाह करता है
neaumusic
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.