`Var {…} =…` कथन में घुंघराले कोष्ठक क्या करते हैं?


117

यकीन नहीं है कि यह एक मोज़िला-विशिष्ट जेएस सिंटैक्स है, लेकिन मुझे अक्सर चर इस तरह से घोषित किए जाते हैं, उदाहरण के लिए, ऐड-ऑन एसडीके डॉक्स में :

var { Hotkey } = require("sdk/hotkeys");

और विभिन्न क्रोम जावास्क्रिप्ट में ( letकथन का उपयोग किया जा रहा है var),

let { classes: Cc, interfaces: Ci, results: Cr, utils: Cu }  = Components;

मुझे यह बहुत भ्रामक लगा लेकिन मुझे एमडीएन पर भी दोनों सिंटैक्स के बारे में कोई दस्तावेज नहीं मिल रहा है ।


@Blender आप इस ढाँचे के लिए symbolhound.com पर कैसे खोज करेंगे?
trusktr

1
@trusktr: थोड़ा लेट: प्रतीकात्मक.com/…
ब्लेंडर

संक्षिप्त उत्तर यहाँ है: stackoverflow.com/a/45909752/203704
क्लिफ हॉल

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

जवाबों:


72

वे दोनों जावास्क्रिप्ट 1.7 विशेषताएं हैं। पहला ब्लॉक-स्तरीय चर है :

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

दूसरे को विनाशकारी कहा जाता है :

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

पायथन से परिचित लोगों के लिए, यह इस वाक्य रचना के समान है:

>>> a, (b, c) = (1, (2, 3))
>>> a, b, c
(1, 2, 3)

पहला कोड चंक इसके लिए शॉर्टहैंड है:

var {Hotkey: Hotkey} = require("sdk/hotkeys");
// Or
var Hotkey = require("sdk/hotkeys").Hotkey;

आप दूसरे कोड के रूप में फिर से लिख सकते हैं:

let Cc = Components.classes;
let Ci = Components.interfaces;
let Cr = Components.results;
let Cu = Components.utils;

2
मेरे प्रयोग से, ऐसा लगता है कि var { Hotkey }इसके बराबर है var { Hotkey: Hotkey }। प्रलेखन का पता लगाने के लिए धन्यवाद!
टाइमड्रीम

@timdream: मुझे लग रहा था कि यह कुछ ऐसा है, लेकिन यह कैसे अलग है var Hotkey = require(...).Hotkey? या यह सिर्फ कीस्ट्रोक्स बचा रहा है?
ब्लेंडर

ऐसा दिखता है: - / (
हेहे

2
इसके अलावा यह इस तरह के एक असामान्य वाक्यविन्यास का उपयोग करने के लिए सब कुछ अधिक गूढ़ बनाता है।
trusktr

दूसरा है "ऑब्जेक्ट डिस्ट्रक्ट्यूरिंग", डेवलपर के पास हैं
।.m.millailla.org

80

आप जो देख रहे हैं वह विनाशकारी काम है। यह हास्केल की तरह पैटर्न का मिलान है

विनाशकारी असाइनमेंट का उपयोग करके आप ऑब्जेक्ट और एरेज़ से मान निकाल सकते हैं और ऑब्जेक्ट और एरे शाब्दिक सिंटैक्स का उपयोग करके उन्हें नए घोषित चर में असाइन कर सकते हैं। इससे कोड बहुत अधिक रसीला हो जाता है।

उदाहरण के लिए:

var ascii = {
    a: 97,
    b: 98,
    c: 99
};

var {a, b, c} = ascii;

उपरोक्त कोड इसके बराबर है:

var ascii = {
    a: 97,
    b: 98,
    c: 99
};

var a = ascii.a;
var b = ascii.b;
var c = ascii.c;

इसी तरह सरणियों के लिए:

var ascii = [97, 98, 99];

var [a, b, c] = ascii;

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

var ascii = [97, 98, 99];

var a = ascii[0];
var b = ascii[1];
var c = ascii[2];

आप निम्न प्रकार से एक ऑब्जेक्ट प्रॉपर्टी को भी निकाल सकते हैं और उसका नाम बदल सकते हैं:

var ascii = {
    a: 97,
    b: 98,
    c: 99
};

var {a: A, b: B, c: C} = ascii;

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

var ascii = {
    a: 97,
    b: 98,
    c: 99
};

var A = ascii.a;
var B = ascii.b;
var C = ascii.c;

यही सब है इसके लिए।


12
उदाहरणों को नष्ट करने वाली वस्तु के लिए +1, वे वास्तव में सहायक हैं। MDN उदाहरण केवल सरणी destructuring दिखा।
ब्लेंडर

@ ब्लेंडर - वे वस्तु विनाशकारी उदाहरण प्रदान करते हैं। ऑब्जेक्ट की एक सरणी में मानों पर लूपिंग देखें ।
आदित एम शाह

मेरा मतलब var {a, b, c} = ascii;सिंटैक्स था।
ब्लेंडर

यह अंतिम उदाहरण वास्तव में अजीब है क्योंकि आम तौर पर बृहदान्त्र के बाईं ओर क्या सौंपा जा रहा है।
कर्टिस

1

यह जावास्क्रिप्ट में एक विनाशकारी असाइनमेंट है और ES2015 मानक का हिस्सा है। यह ऑब्जेक्ट से सरणियों या गुणों के मूल्यों को अलग-अलग चर में अनपैक या अर्क करता है। जैसे: ऐरे विनाशकारी

var foo = ["one", "two", "three"];
//without destructuring
var one = foo[0];
var two = foo[1];
var three = foo[2];

// विनाशकारी संस्करण के साथ [एक, दो, तीन] = फू

जैसे: वस्तु का विनाश

var o = {p: 42, q: true}; var {p, q} = o;

console.log (पी); // 42 कंसोल.लॉग (क्यू); // सच

// नए चर नाम निर्दिष्ट करें {p: foo, q: bar} = o;

console.log (foo); // 42 कंसोल.लॉग (बार); // सच


0

letएमडीएन पर बयान के लिए प्रलेखन है : https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Statements/let

letइसके समान है varकि यह घोषित चर के दायरे को सीमित करता है। यह आपको एक if(){}ब्लॉक (या कुछ अन्य ब्लॉक) के अंदर एक चर घोषित करने की अनुमति देता है और उस चर को केवल उस ब्लॉक के अंदर "दिखाई" देता है (जावास्क्रिप्ट, अब तक, फ़ंक्शन गुंजाइश है और अधिकांश अन्य भाषाओं के रूप में ब्लॉक गुंजाइश नहीं है)। तो letमूल रूप से कुछ लोगों के साथ कुछ मुद्दों के लिए एक "फिक्स" है। ध्यान दें कि tihs एक जावास्क्रिप्ट 1.7 सुविधा है।

कुछ भी नहीं मिला {Foo}


क्षमा करें, मुझे लगा कि आप दोनों के बारे में पूछ रहे हैं ... मेरा गूगल-फू मुझे तब विफल हो जाता है जब यह आता है {Foo}: /
Jan Hančič

मुझे भी: - / Google इंडेक्स नहीं करता है {और }
समयधर्म
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.