2011-08-08 14 views
60
var a,b,c; 
var arr = [1,2,3]; 
[a,b,c] = arr; 

यह कोड फ़ायरफ़ॉक्स में पूरी तरह से काम करता है जिसके परिणामस्वरूप एक = 1, बी = 2 और सी = 3,
है लेकिन यह क्रोम में काम नहीं करता है। क्या यह क्रोम बग है या
यह मान्य जावास्क्रिप्ट कोड नहीं है? (मैं इसे जावास्क्रिप्ट संदर्भों में ढूंढने में असफल रहा)जावास्क्रिप्ट। एकाधिक चरों में सरणी मान असाइन करें?

मैं क्रोम के लिए इसे उपयुक्त बनाने के लिए इस कोड को कैसे संशोधित कर सकता हूं, न्यूनतम नुकसान के साथ?
(मैं वास्तव में एक = लिखने के लिए पसंद नहीं है आगमन [0]; ख = आगमन [1] ... या arr.shift() हर समय के साथ एक ही)

पी.एस. यह सिर्फ एक उदाहरण कोड है, असली कोड
में मैंने कहीं मेरे कोड बाहर

+1

क्रोम में क्या होता है? आपको क्या त्रुटि संदेश मिलते हैं? –

+0

यह मुझे देता है निम्नलिखित: ReferenceError तर्क: सरणी [0] संदेश: "-" ढेर: "-" प्रकार: "invalid_lhs_in_assignment" __proto__: त्रुटि – tsds

+1

Fwiw, http://www.jslint.com/ कहते हैं कि यह ठीक है (कुछ सफेद जगह तय करने के बाद, हालांकि मुझे नहीं पता कि यह किस प्रकार मूल्यांकन करेगा), लेकिन http://jshint.com/ कहता है कि यह एक खराब असाइनमेंट है। – JAAulde

उत्तर

64

यह जावा स्क्रिप्ट 1.7 की एक नई सुविधा Destructuring assignment कहा जाता है से आगमन सरणी मिल:

Destructuring assignment makes it possible to extract data from arrays or objects using a syntax that mirrors the construction of array and object literals.

The object and array literal expressions provide an easy way to create ad-hoc packages of data. Once you've created these packages of data, you can use them any way you want to. You can even return them from functions.

One particularly useful thing you can do with destructuring assignment is to read an entire structure in a single statement, although there are a number of interesting things you can do with them, as shown in the section full of examples that follows.

You can use destructuring assignment, for example, to swap values:

var a = 1; 
var b = 3; 
[a, b] = [b, a]; 

This capability is similar to features present in languages such as Perl and Python.

दुर्भाग्य से, this table of versions के अनुसार, जावास्क्रिप्ट 1.7 क्रोम में लागू नहीं किया गया है।

  • Firefox 2.0+
  • आईई 9
  • ओपेरा 11.50: लेकिन उस में होना चाहिए।

इस jsfiddle में खुद के लिए यह प्रयास करें: http://jsfiddle.net/uBReg/

मैं (विफल), आईई 8 (विफल) क्रोम पर इस परीक्षण किया है, और फ़ायर्फ़ॉक्स 5 (जो काम किया, विकी तालिका के अनुसार)।

+0

विनाश (संभावित) [आधिकारिक भाषा सुविधा के रूप में आ रहा है] (http://wiki.ecmascript.org/doku.php?id=harmony:destructuring) के अगले संस्करण में ईसीएमएस्क्रिप्ट, इसलिए Google क्रोम निश्चित रूप से प्रस्तावित स्टिक मान लेगा। – user113716

+1

यह बहुत अच्छा होगा; जावास्क्रिप्ट 1.7+ में कुछ रोमांचक विशेषताएं हैं ... यह दुर्भाग्यपूर्ण है कि इन ब्राउज़र असंगतताओं के कारण इस समय उन्हें "असली दुनिया" अनुप्रयोगों के लिए उपयोग नहीं किया जा सकता है। –

+0

ठीक है। क्या आपको लगता है कि एक = arr.shift() से ऐसा करने के लिए अधिक कॉम्पैक्ट और स्पष्ट तरीका है? – tsds

7

यह केवल जावास्क्रिप्ट 1.7 के लिए संभव है जैसा कि पहले से ही @ जस्टिन द्वारा उत्तर दिया गया है। यहां व्यापक ब्राउज़र में अनुकरण करने का एक परीक्षण दिया गया है:

function assign(arr, vars) { 
    var x = {}; 
    var num = Math.min(arr.length, vars.length); 
    for (var i = 0; i < num; ++i) { 
     x[vars[i]] = arr[i]; 
    } 
    return x; 
} 
var arr = [1, 2, 3]; 
var x = assign(arr, ['a', 'b', 'c']); 
var z = x.a + x.b + x.c; // z == 6 

मुझे नहीं पता कि यह कितना उपयोगी है।

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