2008-10-15 4 views
16

में असाइनमेंट को नष्ट करना जावास्क्रिप्ट 1.7 के लिए मोज़िला चेंजलॉग में देखा जा सकता है, उन्होंने विनाशकारी असाइनमेंट जोड़ा है। दुर्भाग्य से मैं वाक्य रचना के बहुत शौकीन नहीं हूँ (क्यों एक लिखने और ख दो बार?):जावास्क्रिप्ट

var a, b; 
[a, b] = f(); 

कुछ इस तरह एक बहुत बेहतर होता:

var [a, b] = f(); 

अभी भी पीछे की ओर संगत होगा कि । पायथन की तरह विनाश पीछे संगत नहीं होगा।

वैसे भी जावास्क्रिप्ट 1.5 के लिए सबसे अच्छा समाधान है कि मैं साथ आने के लिए सक्षम किया गया है है:

function assign(array, map) { 
    var o = Object(); 
    var i = 0; 
    $.each(map, function(e, _) { 
     o[e] = array[i++]; 
    }); 
    return o; 
} 

कौन सा की तरह काम करता है:

var array = [1,2]; 
var _ = assign[array, { var1: null, var2: null }); 
_.var1; // prints 1 
_.var2; // prints 2 

लेकिन यह वास्तव में बेकार है क्योंकि _ कोई अर्थ नहीं है। नामों को स्टोर करने के लिए यह सिर्फ एक खाली खोल है। लेकिन दुख की बात है कि इसकी आवश्यकता है क्योंकि जावास्क्रिप्ट में पॉइंटर्स नहीं हैं। प्लस तरफ आप मानों का मिलान नहीं होने पर डिफ़ॉल्ट मान असाइन कर सकते हैं। यह भी ध्यान रखें कि यह समाधान सरणी को टुकड़ा करने की कोशिश नहीं करता है। तो आप {first: 0, rest: 0} जैसे कुछ नहीं कर सकते हैं। लेकिन अगर वह उस व्यवहार को चाहता था तो आसानी से किया जा सकता था।

बेहतर समाधान क्या है?

उत्तर

23

पहले, var [a, b] = f() काम करता जावास्क्रिप्ट 1.7 में ठीक - यह कोशिश करो!

दूसरे, आप with() का उपयोग कर उपयोग वाक्य रचना थोड़ा बाहर चिकनी कर सकते हैं:

var array = [1,2]; 
with (assign(array, { var1: null, var2: null })) 
{ 
    var1; // == 1 
    var2; // == 2 
} 
बेशक

, यह आपके मौजूदा चरों के मान को संशोधित करने की अनुमति नहीं होगी, इसलिए यह IMHO एक पूरी बहुत कम है जावास्क्रिप्ट 1.7 फीचर से उपयोगी। कोड में मैं अब लिख रहा हूं, मैं सिर्फ वस्तुओं को सीधे वापस भेजता हूं और उनके सदस्यों का संदर्भ देता हूं - मैं 1.7 सुविधाओं के लिए अधिक व्यापक रूप से उपलब्ध होने का इंतजार करूंगा।

+0

धन्यवाद! यह डाउनसाइड्स में से एक को ठीक करता है :) –

+2

आज के रूप में 'var [a, b] = [1,2];' क्रोम में सिंटैक्स त्रुटि में परिणाम। – Marcin

+9

@ मार्सिन: जावास्क्रिप्ट 1.7 एक [मोज़िला-केवल भाषा] है (http://stackoverflow.com/questions/1330498/what-is-cross-browser-support-for-javascript-1-7s- new-features- विशेष रूप से -ar)। – Shog9

4

आपको डमी "_" चर की आवश्यकता नहीं है। आप सीधे "वैश्विक" वैरिएबल बना सकते हैं विंडो ऑब्जेक्ट दायरे का उपयोग करके:

window["foo"] = "bar"; 
alert(foo); // Gives "bar" 

यहाँ कर रहे हैं कुछ अधिक अंक:

  • मैं इस समारोह "निर्दिष्ट" क्योंकि वह भी सामान्य का नाम नहीं होता अवधी।
  • जेएस 1.7 सिंटैक्स की तुलना में अधिक बारीकी से मिलकर, मैं कार्य को पहले तर्क और स्रोत को द्वितीय तर्क के रूप में गंतव्य ले जाऊंगा।
  • गंतव्य चर को पारित करने के लिए किसी ऑब्जेक्ट का उपयोग करना ठंडा है लेकिन जेएस 1.7 के साथ भ्रमित किया जा सकता है जहां गंतव्य वास्तव में एक वस्तु है और एक सरणी नहीं है। मैं एक स्ट्रिंग के रूप में परिवर्तनीय नामों की अल्पविराम सीमांकित सूची का उपयोग करना पसंद करता हूं।

यहाँ मैं के साथ आया है:

function destructure(dest, src) { 
    dest = dest.split(","); 

    for (var i = 0; i < src.length; i++) { 
     window[dest[i]] = src[i]; 
    } 
} 

var arr = [42, 66]; 

destructure("var1,var2", arr); 

alert(var1); // Gives 42 
alert(var2); // Gives 66 
+2

एकमात्र चीज जिसके साथ मैं सहमत हूं वह यह है कि विनाश एक बेहतर नाम हो सकता है। * स्रोत, गंतव्य यूनिक्स शैली है। * वैश्विक दायरे populating अच्छा नहीं है। यह composability का कारण नहीं है। * एक स्ट्रिंग के रूप में आउटपुट वैरिएबल लिखना आपके संपादक के लिए जांचना कठिन और कठिन है। एसक्यूएल लिखना पसंद है। –

+0

@AndersRuneJensen चूंकि यह एक असाइनमेंट की नकल करता है, गंतव्य लगभग निश्चित रूप से बाईं ओर होना चाहिए-जिस तरह से यह '[var1, var2] = arr' जैसा दिखता है। और 'विनाश' एक भयानक, गैर-इरादा-खुलासा नाम है। मुझे लगता है कि 'असाइन' बेहतर है-आखिरकार, यह * सामान्य * एक सामान्य उपयोगिता कार्य होना चाहिए। यदि नहीं, तो शायद 'massAssign'? –

0

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

function divMod1(a, b) { 
    return [ Math.floor(a/b), a % b ]; 
} 

var _ = divMod1(11, 3); 
var div = _[0]; 
var mod = _[1]; 
alert("(1) div=" + div + ", mod=" + mod); 

हालांकि मुझे लगता है कि निम्नलिखित पैटर्न अधिक idomatic है:

function divMod2(a, b, callback) { 
    callback(Math.floor(a/b), a % b); 
} 

divMod2(11, 3, function(div, mod) { 
    alert("(2) div=" + div + ", mod=" + mod); 
}); 

नोट, कि दो परिणामों को एक सरणी के रूप में लौटने की बजाय, हम उन्हें कॉलबैक फ़ंक्शन में तर्क के रूप में पास करते हैं।

1

यहाँ है कि मैं क्या PHPstorm 10 में किया था है (कोड http://jsfiddle.net/vVQE3/ पर चल देखें):

फ़ाइल -> सेटिंग्स -> बोली & फ़्रेमवर्क -> ...

... उदाहरण के लिए जावास्क्रिप्ट भाषा संस्करण सेट करें जावास्क्रिप्ट 1.8.5 ...

-> लागू करें पर क्लिक करें।

संबंधित मुद्दे