रूबी के = = (या बराबर) जावास्क्रिप्ट में?


128

मुझे रूबी का ||=तंत्र बहुत पसंद है। यदि कोई चर मौजूद नहीं है या है nil, तो इसे बनाएं और इसे किसी चीज़ के बराबर सेट करें:

amount # is nil
amount ||= 0 # is 0
amount ||= 5 # is 0

मुझे अब जावास्क्रिप्ट में कुछ ऐसा ही करने की आवश्यकता है। ऐसा करने के लिए अधिवेशन या उचित तरीका क्या है? मुझे पता ||=है कि वाक्यविन्यास मान्य नहीं है। इसे संभालने के 2 स्पष्ट तरीके हैं:

window.myLib = window.myLib || {};

// or

if (!window.myLib)
  window.myLib = {};

जवाबों:


152

दोनों बिल्कुल सही हैं, लेकिन अगर आप किसी ऐसी चीज की तलाश कर रहे हैं ||=जो रूबी की तरह काम करती है । पहली विधि जो variable = variable || {}आप देख रहे हैं वह है :)


1
इसका उपयोग करते समय सावधानी xबरतें कि यदि कोई वैध मान गलत है, जैसे कि false, और आप केवल xअपरिभाषित होने पर डिफ़ॉल्ट सेट करना चाहते हैं ।
जोशुआ पिन्टर

उपरोक्त टिप्पणी सही है। अपने उदाहरण के मामले को लेते हुए, यह जेएस में उसी तरह काम नहीं करेगा। let amount = 0;इसके बाद amount = amount || 5 राशि बदल जाएगी 5. यदि आप नहीं चाहते कि ??इसके बजाय ऑपरेटर का उपयोग करें ||
अश्विनकुमार

@AshwinKumarS या बस उपयोग करें amount ??= 5;
user4642212

22

आप तार्किक या ऑपरेटर का उपयोग कर सकते हैं, ||जो उसके सही संचालन का मूल्यांकन करता है, अगर गलत lValमूल्य है।

झूठे मूल्यों में शामिल हैं जैसे null, false, 0, "", undefined, NaN

x = x || 1

इसका उपयोग करते समय सावधानी xबरतें कि यदि कोई वैध मान गलत है, जैसे कि false, और आप केवल xअपरिभाषित होने पर डिफ़ॉल्ट सेट करना चाहते हैं ।
जोशुआ पिन्टर

4

यदि आप वस्तुओं के साथ काम कर रहे हैं, तो आप विनाशकारी (ES6 के बाद से) का उपयोग कर सकते हैं:

({ myLib: window.myLib = {} } = window);

... लेकिन आप भ्रम को छोड़कर स्वीकृत उत्तर पर कुछ हासिल नहीं करते हैं।


1
"लेकिन आप भ्रम को छोड़कर स्वीकृत उत्तर पर कुछ हासिल नहीं करते हैं" - अच्छा। :)
lindes

मुझे यकीन है कि किसी को यह जावास्क्रिप्ट से नफरत करने के लिए एक कारण के रूप में लिया जाएगा
Volper

1

आपके द्वारा पूछे गए ऑपरेटर को जावास्क्रिप्ट में एक विशेषता के रूप में प्रस्तावित किया गया है । यह वर्तमान में स्टेज 3 पर है , इसलिए यह अभी तक भाषा का आधिकारिक हिस्सा नहीं है, लेकिन इसे स्वीकार कर लिया जाएगा, यदि अधिकांश अप्रत्याशित बदलावों की खोज की जाए, तो वे बहुत ही मामूली बदलाव होंगे।

आप इसे अब प्लगइन-प्रस्ताव-तार्किक-असाइनमेंट-ऑपरेटर्स बैबेल प्लगइन का उपयोग करके उपयोग कर सकते हैं । मैंने कभी भी उस प्लगइन का उपयोग नहीं किया है, इसलिए मुझे नहीं पता कि यह कितनी अच्छी तरह काम करता है।


-1

रूबी का || = ऑपरेटर शॉर्ट सर्किट असाइनमेंट इसे इस तरह से सोचा जा सकता है:

return a || a = b

तो जावास्क्रिप्ट में, यह बहुत समान दिखता है:

return a || (a = b);

जैसा कि नीचे दिए गए टिप्पणियों में कहा गया है, ऐसा लगता है कि यह शाब्दिक माणिक रूप मानक जावास्क्रिप्ट मुहावरे की तुलना में कम कुशल है a = a || ख।

संदर्भ के लिए: http://www.rubyinside.com/what-rubys-double-pipe-or-equals-really-does-5488.html


1
व्यवहार में ऐसा लगता है कि a = a || bफ़ॉर्म अधिक इष्टतम jsperf.com/x-or-x-equals-0-vs-x-equals-x-or-0/3
jchook

आह शांत उपकरण। यदि x का मान है और शॉर्ट सर्किट है तो यह कैसा दिखता है?
क्रिस

मेरा मानना ​​है कि अशांति को jsperf पर स्पष्ट करने की आवश्यकता है, इसलिए इस परीक्षण को शॉर्ट सर्किट प्रदर्शन दिखाना चाहिए। मेरा अनुमान है कि V8 फॉर्म के लिए एक विशेष अनुकूलन है a = a || b
jchook

3
FYI करें यह दिखता है कि जो भी अंतर था वह अब दूर अनुकूलित किया गया है।
चार्ल्स वुड

a || (a = b)फ़ंक्शन के नामों का पता लगाने के लिए सही शब्दार्थ है। यह वर्तमान में नए प्रस्ताव के लिए चर्चा में है
user4642212

-1

आप केवल पूर्णांकों के लिए जावास्क्रिप्ट में = ऑपरेटर का उपयोग करके वांछित व्यवहार को प्राप्त कर सकते हैं। लेकिन आपको पहले वेरिएबल को परिभाषित करना होगा।

let a = 0
a |= 100
console.log(a) // 100

वस्तुओं के लिए

let o = {}
o.a |= 100
console.log(o) // {a: 100}

Arrays के लिए

let arr = []
arr[0] |= 100
console.log(arr) // [100]

सवाल के बारे में नहीं है |या |=। प्रश्न में वांछित व्यवहार बिटवाइज़ ऑपरेशंस से संबंधित नहीं है।
user4642212

आप सही हैं मैं तदनुसार उत्तर को संपादित
करूंगा

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