2016-01-17 6 views
6

पृष्ठभूमिक्या मैं वस्तुओं के असाइनमेंट को नष्ट करने के लिए चर घोषित कर सकता हूं?

जब मैं सरणियों मैं करने में सक्षम था के साथ काम करने की कोशिश की destructuring मेरी चर पूर्व घोषित:

let a, b, c; 
let arr = [1, 2, 3, 4, 5]; 
[a, b, c] = arr; 

console.log(a) // logs 1 
console.log(b) // logs 2 
console.log(c) // logs 3 

इस कोलाहल संकलक ठीक से गुजरना पड़ा।

हालांकि जब मैं वस्तुओं के साथ भी ऐसा ही करने की कोशिश की मैं एक त्रुटि

let a, b, c 
let obj = {cat: 'meow', dog: 'woof', mouse: 'squeak'}; 
{cat: a, dog: b, mouse: c} = obj; 

console.log(a) // I want this to log 'meow' 
console.log(b) // I want this to log 'woof' 
console.log(c) // I want this to log 'squeak' 

प्रश्न

यह एक ES6 या कोलाहल मोड़/समस्या है मिल गया? यदि यह ES6 के लिए जानबूझकर है, तो सरणी के तरीके से अंतर क्यों माना जाता है?

नोट

मैं समझता हूँ let साथ var की जगह का मतलब है कि मैं अपने चर पूर्व घोषित करने के लिए आवश्यक है और let इनलाइन होने मान्य है (और मुझे विश्वास है, आम तौर पर पसंद) है कि नहीं कर रहा हूँ। मैं "इसे बिल्कुल ऐसा न करें" उत्तर के बजाय कार्यान्वयन के बीच के अंतर के बारे में जानना चाहता हूं।

+0

क्या आप भी इस के साथ पूरा करने के लिए कोशिश कर रहे हैं एक ही लिख सकते हैं: '{ बिल्ली: ए, कुत्ता: बी, माउस: सी} = ओबीजे; '? आपके पास 'obj' में पूरी तरह से बनाई गई वस्तु है। यदि आप इसे किसी अन्य ऑब्जेक्ट पर कॉपी करना चाहते हैं, तो आप 'ऑब्जेक्ट.साइन() 'का उपयोग करें। – jfriend00

+0

@ jfriend00 मैं सीख रहा हूं कि असाइनमेंट कैसे काम करता है - उदाहरण पूरी तरह से सीखने के उद्देश्यों के लिए हैं। लेकिन सामान्य उद्देश्य एक नई वस्तु बनाने के बजाय 'ए', 'बी',' सी' को मान असाइन करना होगा। प्रतिलिपि बनाना प्रतिलिपि के बजाय * टूटना चाहिए *। –

+0

फिर, आप केवल एक सामान्य घोषणा का उपयोग कर सकते हैं: 'myObj = {cat: a, dog: b, mouse: c}; '। आपको इसके लिए विनाश की आवश्यकता नहीं है। यदि आप अपने पहले से मौजूद ऑब्जेक्ट में गुणों को 'ए',' बी' और 'सी' के मानों से असाइन करना चाहते हैं, तो आपको उन्हें मैन्युअल रूप से 'obj.cat = a;' असाइन करना होगा। – jfriend00

उत्तर

12

आप एक वस्तु destructing कर रहे हैं,

  1. आप वस्तु में कुंजी के रूप में एक ही चर नाम प्रयोग करना होगा। केवल तभी आपको एक से एक पत्राचार मिलेगा और मूल्यों को ठीक से नष्ट कर दिया जाएगा।

  2. और यदि आप घोषणा विवरण का उपयोग नहीं कर रहे हैं, तो आपको संपूर्ण असाइनमेंट को ब्रांड्स में लपेटने की आवश्यकता है, अन्यथा बाएं हाथ की ओर अभिव्यक्ति में वर्णित वस्तु को ब्लॉक के रूप में माना जाएगा और आपको सिंटेक्स त्रुटि मिल जाएगी।


तो अपने नियत कोड जैसा होगा इस

'use strict'; 
let cat, dog, mouse; 
let obj = {cat: 'meow', dog: 'woof', mouse: 'squeak'}; 
({cat, dog, mouse} = obj);  // Note the `()` around 

आप वास्तव में के रूप में

'use strict'; 
let obj = {cat: 'meow', dog: 'woof', mouse: 'squeak'}; 
let {cat, dog, mouse} = obj; 
+1

आह, धन्यवाद! यह लपेटने वाले माता-पिता थे जिन्हें मैं समझ नहीं पाया था।स्पष्टीकरण के लिए धन्यवाद कि इसे अन्यथा एक ब्लॉक माना जाएगा - अब और अधिक समझ में आता है :) –

+0

"रैपिंग पैरों" के अलावा, जवाब गलत है :( –

+0

@Refael क्या आप समझा सकते हैं कि उत्तर गलत क्यों है? – thefourtheye

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